api_git - mathieu-bergeron/aquiletour2021 GitHub Wiki

API module Git

Les Id

  1. .*Id est une chaîne où:
    • taille de 1 à 255 caractères
    • est un nom fichier valide en Linux
    • en particulier: [a-zA-Z0-9._-]
  2. teacherId est en minuscule

Les Path

  1. .*Path est un chemin de la forme /a/b/c/...a,b,c sont des Id valide

Les clés

  1. teacherId est unique
  2. (teacherId, courseId) est unique
  3. (teacherId, semesterId) est unique

L'horodatage

  1. Les dates sont en epochTime UTC, en secondes (c-à-d le Unix time)
    • 0 == 1 jan 1970 UTC

Types de messages

  1. Tableau de bord == msg ==> Module Git

    • un message vers le module Git
    • POST à /_git_api avec le JSON du message (dans le body)
    • réponse: 200 OK ou autre
  2. Tableau de bord <== msg == Module Git

    • un message vers le tableau de bord
    • POST à /_http/messages/ avec le JSON du message (dans le body)
    • réponse: 200 OK ou autre
  3. Tableau de bord == req ==> Module Git

    • une requête vers le module Git
    • POST à /_git_api avec le JSON du message (dans le body)
    • réponse: 200 OK ou autre + dans le body:
      • le JSON d'un modèle

Messages

RegisterExercise

  • Tableau de bord == msg ==> Module Git

  • Envoyé à chaque fois qu'un prof ajoute un exercice de type Git au calendrier de cours

  • JSON du message

      {
          "_C": "RegisterExercise",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "MaSession",
          "groupId": "Mardi",
          "exercisePath": "/tp1/exercice1"
          "repoPath": "/tp1"
          "sourceFolderPath": "/exercice01",
          "completionKeywords": "Exercice 1",
      }
      
  • NOTE: exercisePath est toujours à partir de la racine du calendrier

DeleteExercise

  • Tableau de bord == msg ==> Module Git
  • Comme RegisterExercise, mais pour supprimer l'exercice

ModifyExercise

  • Tableau de bord == msg ==> Module Git

  • Envoyé à chaque fois qu'un prof modifie un exercice de type Git au calendrier de cours

  • JSON du message

      {
          "_C": "ModifyExercise",
          "teacherId": "mathieu.bergeron"
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "exercisePath": "/tp1/exercice1"
          "oldRepoPath": "/tp1"
          "oldSourceFolderPath": "/exercice01",
          "oldCompletionKeywords": "Exerce 1",
          "repoPath": "/"
          "sourceFolderPath": "/TP1/exercice01",
          "completionKeywords": "Exercice 1",
      }
      

RegisterGitRepoForCourse

  • Tableau de bord == msg ==> Module Git

  • Envoyé à chaque fois qu'un prof ajoute un Git repo à un cours

  • JSON du message

      {
          "_C": "RegisterGitRepoForCourse",
          "teacherId": "nicolas.leduc"
          "semesterId": "H2021",
          "courseId": "IntroProg",
          "repoPath": "/tps/depotgit"
      }
      

RegisterGitRepo

  • Tableau de bord == msg ==> Module Git

  • Envoyé à chaque fois qu'un étudiant ajoute une URL Git dans son calendrier de cours

  • JSON du message

      {
          "_C": "RegisterGitRepo",
          "teacherId": "nicolas.leduc"
          "courseId": "IntroProg",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "bob.berancourt",
          "repoPath": "/tps/depotgit"
          "repoUrl": "https://github.com/test/test.git",
      }
      

DeleteGitRepo

  • Tableau de bord == msg ==> Module Git
  • Comme RegisterGitRepo, mais pour supprimer le dépôt GIT
  • Détruit toutes les informations relatives au dépôt dans la BD

OnClone

  • Tableau de bord <== msg == Module Git

  • Envoyé après avoir cloné un dépôt

  • JSON du message

      {
          "_C": "OnClone",
          "repoUrl": "https://github.com/test/test.git",
          "teacherId": "nicolas.leduc"
          "courseId": "IntroProg",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "bob.berancourt",
          "repoPath": "/Semaine01"
      }
      

OnCloneFailed

  • Tableau de bord <== msg == Module Git

  • Envoyé si cloner un dépôt a échoué

  • JSON du message

      {
          "_C": "OnCloneFailed",
          "repoUrl": "https://github.com/test/test.git",
          "teacherId": "nicolas.leduc",
          "courseId": "IntroAlgo",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "repoPath": "/Semaine 01"
      }
      

OnPull

  • Tableau de bord <== msg == Module Git

  • Envoyé après avoir mis à jour un dépôt

  • JSON du message

      {
          "_C": "OnPull",
          "repoUrl": "https://github.com/test/test.git",
          "teacherId": "nicolas.leduc",
          "courseId": "IntroProg",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "bob.berancourt",
          "repoPath": "/Semaine 01"
      }
      

OnPullFailed

  • Tableau de bord <== msg == Module Git

  • Envoyé si la mise à jour d'un dépôt a échoué

  • JSON du message

      {
          "_C": "OnPullFailed",
          "repoUrl": "https://github.com/test/test.git",
          "teacherId": "nicolas.leduc",
          "courseId": "IntroAlgo",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "repoPath": "/Semaine 01"
      }
      

OnUnknownRepoURL

  • Tableau de bord <== msg == Module Git

  • Envoyé si l'url d'un git hook n'existe pas dans la DB

  • JSON du message

      {
          "_C": "OnUnknownRepoURL",
          "repoUrl": "https://github.com/test/test.git",
      }
      

OnNewCommits

  • Tableau de bord <== msg == Module Git

  • Envoyé après un pull

  • JSON du message

      {
          "_C": "OnNewCommits",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
      	"latestCommitBeforeThis": "asdfasdfw34qfadsfasdrf3",
      	"commits": [
      		{
      			"_C": "Commit",
      			"commitId": "asdfasdfw34qfadsfasdrf3",
      			"exercisePathIfCompleted": "Semaine 10/Etape 01/Exercice 10",
      			"modifiedFiles": [
      			    {
      				   "path": "/src/atelier4/Exercise2.java",
      			        "estimatedEffort": 34,
      			        "exercisePath": "/Étape 1/Atlier 4/Exercice 2",
      			    },
      			    {
      				   "path": "/src/atelier2/Exercise3.java",
      			        "estimatedEffort": 3,
      			        "exercisePath": "/Étape 1/Atlier 2/Exercice 3",
      			    }
      			],
      			"commitMessageFirstLine": "Blah Blah",
      			"commitMessage": "Blah Blah",
      			"timeStamp": "1615215942"
      		},
      	]
      }
      

OnExerciseCompleted

  • Tableau de bord <== msg == Module Git

  • Envoyé après un pull si un des commentaires de commit match les completionKeywords d'un exercice

  • JSON du message

      {
          "_C": "OnExerciseCompleted",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "exercisePath": "/TP1/Exercice 1"
      }
      

OnExerciseCompletedUpdate

  • Tableau de bord <== msg == Module Git

  • Envoyé après un update si le statut d'un exercice a changé (complété <-> incomplet) selon les mots clés

  • JSON du message

      {
          "_C": "OnExerciseCompletedUpdate",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "exercisePath": "/TP1/Exercice 1"
          "exerciseCompleted" : "False"
      }
      

OnCommitModelUpdate

  • Tableau de bord <== msg == Module Git

  • Envoyé après un update si l'exercice associé à un fichier dans un commit a changé

  • JSON du message

      {
          "_C": "OnCommitModelUpdate",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500"
      }
      

GetCommitsForRepo

  • Tableau de bord == req ==> Module Git

  • JSON de la requête

      {
          "_C": "GetCommitsForRepo",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "repoPath": "/semaine01/depotgit"
          "fromDate" : 1615215942,
          "toDate" : 1615216442,
          "recursive": true
      }
      
  • NOTE:

    • / : les commits de tous les dépôts
    • /semaine01 : les commits des dépôts qui match /semaine01
    • recursive est à False par défaut s'il est absent de la requête
    • fromDate/toDate sont à -1 si non-désiré
  • Réponse: un modèle CommitListModel

GetCommitsForExercise

  • Tableau de bord == req ==> Module Git

  • JSON de la requête

      {
          "_C": "GetCommitsForExercise",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "01",
          "studentId": "1234500",
          "exercisePath": "/Étape 1"
          "fromDate" : 1615215942,
          "toDate" : 1615216442,
          "recursive": false
      }
      
  • NOTE:

    • / : les commits de tous les exercice
      • retourne vide si aucun exercice
    • /TP1 : les commits des exercices dont le chemin commence par /TP1
      • (de tous les dépôts qui match)
    • recursive est à True par défaut s'il est absent de la requête
    • fromDate/toDate sont à -1 si non-désiré
  • DÉSIRÉ: mettre "*" comme courseId et avoir tous les commits de l'étudiant

  • Réponse: un modèle CommitListModel

GetLateStudents

  • Tableau de bord == req ==> Module Git

  • JSON de la requête

      {
          "_C": "GetLateStudents",
          "teacherId": "mathieu.bergeron",
          "courseId": "StruDon",
          "semesterId": "H2021",
          "groupId": "Mardi",
          "exercisePath": "/TP1/Exercice 1",
          "deadline": 1615215942
      }
      
  • Réponse: un modèle LateStudentsModel

GetStudentSummaries

  • Tableau de bord == req ==> Module Git

  • JSON de la requête

      <pre>
      {
          "_C":"GetStudentSummaries",
          "teacherId": "nicolas.leduc",
          "courseId": "IntroProg",
          "semesterId": "H2021",
          "groupId": "01",
          "exercisePath": "/Semaine 01/Atelier 1/Exercice 4",
          "deadline": 1615215942
      }
      </pre>
    
  • Réponse: un modèle StudentSummariesModel

Modèles

CommitListModel

{
	"_C": "CommitListModel",
    "teacherId": "nicolas.leduc",
    "courseId": "IntroProg",
    "semesterId": "H2021",
    "groupId": "01",
    "studentId": "1234500",
	"fromDate": 16152151235,
	"toDate": 1615215942,
	"commits": {
		"_C": "ObservableCommitList",
		"value": [
			{
				"_C": "Commit",
				"commitId": "asdfasdfw34qfadsfasdrf3",
				"exercisePathIfCompleted": "Semaine 10/Etape 01/Exercice 10",
				"modifiedFiles": [
				    {
					   "path": "/src/atelier4/Exercise2.java",
				        "estimatedEffort": 34,
				        "exercisePath": "/Étape 1/Atlier 4/Exercice 2",
				        "message": "Plagiat détecté",
				    },
				    {
					   "path": "/src/atelier4/Exercise2.java",
				        "estimatedEffort": 34,
				        "exercisePath": "/",
				        "message": "Chemin d'exercice ambigü",
				    },
				    {
					   "path": "/src/atelier2/Exercise3.java",
				        "estimatedEffort": 3,
				        "exercisePath": "/Étape 1/Atlier 2/Exercice 3",
				        "message": "",
				    }
				],
				"commitMessageFirstLine": "Blah Blah",
				"commitMessage": "Blah Blah",
				"timeStamp": "1615215942"
			},
		]
	}
}

LateStudentsModel

{
    "_C":"LateStudentsModel",
    "semesterId":"H2021",
    "teacherId":"mathieu.bergeron",
    "courseId":"StruDon",
    "groupId":"01",
    "exercisePath":"/etape1/atelier4/exercice5",
    "deadline": 1615215942
    "studentIds": ["1234567","7654321"]
}

StudentSummariesModel

{
    "_C":"StudentSummariesModel",
    "semesterId":"H2021",
    "groupId":"01",
    "exercisePath":"/etape1/atelier4/exercice5",
    "summaries": [
        {
            "_C":"StudentSummary",
            "studentId":"1234567",
            "lastCommitBeforeDealine": 1615215123,
            "lastCommitAfterDealine": 1615215123,
            "exerciseCompleted": true,
            "exerciseCompletedBeforeDeadline": false
        },
        {
            "_C":"StudentSummary",
            "studentId":"7654321",
            "lastCommitBeforeDealine": 1615215123,
            "lastCommitAfterDealine": 1615215123,
            "exerciseCompleted": false,
            "exerciseCompletedBeforeDeadline": false,
        }
    ]
}

Exemples sourceFolderPath

  • /module1/ateliers/atelier2 match module1/atelier2

  • /module2/ateliers/atelier3 match module2/atelier3

  • /module1/tp3 match module1/src/tp3

  • /module2/tp3 match module2/src/tp3

  • /module1/ateliers/atelier2 match module1/src/atelier2

  • /module2/ateliers/atelier2 match module2/src/atelier2

NOTE:

  • on regarde aussi si on peut générer un sourceFolderPath raisonable directement dans le calendrier de cours

  • /semaine01/atelier1/exercice1 match marwane/atelier1/exercice1

  • /semaine01/atelier1/exercice2 match marwane/atelier1/exercice2

  • /semaine02/atelier2/exercice1 match marwane/atelier2/exercice1

⚠️ **GitHub.com Fallback** ⚠️