A progressive Node.js framework for building efficient and scalable server-side applications.
Cette API est conçue pour gérer des bots Discord en utilisant le framework NestJS et Fastify.
- Normes des Commits et Pull Requests
- Installation
- Configuration et Démarrage
- Tests
- Déploiement
- Ressources
- API Endpoints
- Guild Endpoints
- Campus Endpoints
- Channel Endpoints
- Promotion Endpoints
- Roles Endpoints
- Messages Endpoints
- Answers Endpoints
- Comments Endpoints
- Courses Endpoints
- Dashboard Accounts Endpoints
- Discord Users Endpoints
- Members Endpoints
- Resources Endpoints
- Reports Endpoints
- Questions Endpoints
- Votes Endpoints
- XP Transactions Endpoints
- Guilds-Templates Endpoints
- Categories Endpoints
- Identification Requests Endpoints
- Members Informations Endpoints
- Moderator Actions Endpoints
- Tags
Afin de maintenir une cohérence et une clarté dans notre travail collaboratif, nous avons mis en place des normes pour les messages de commit et les pull requests.
Le projet suit le workflow GitFlow pour la gestion des branches. Voici les principales branches à utiliser :
main
: Branche de production, contient le code stabledevelop
: Branche principale de développementfeature/*
: Branches pour les nouvelles fonctionnalitéshotfix/*
: Branches pour les corrections urgentesrelease/*
: Branches pour la préparation des versions
Règles importantes :
- Toute nouvelle fonctionnalité doit partir de
develop
et créer une branchefeature/nom-de-la-feature
- Les corrections urgentes partent de
main
avec une branchehotfix/nom-du-fix
- Les branches
feature
sont fusionnées dansdevelop
- Les
hotfix
sont fusionnés dansmain
ETdevelop
Les messages de commit doivent suivre ce format :
type(portée): titre du commit
type : Le type de modification, par exemple "fix" ou "feat".
portée : Le dossier concerné (un commit par fichier modifié, supprimé ou ajouté). La portée à indiquer sera l'identifiant de la tâche associée au ticket, par exemple noter 86c21fxeg pour la tâche suivante:
titre du commit: Une description concise du changement apporté. En l'occurence (en anglais)
feat(controller): add problem endpoints
Ajouter un body : Si le titre du commit n'est pas assez explicite sur la localisation de la modification, le nom du fichier doit être précisé dans le body.
In file "problem.controller.ts"
Cela permet de donner plus d'informations sur les raisons du changement, son impact ou les fichiers modifiés.
Bonne pratique : Respecter une longueur maximale d'environ 50 caractères pour les titres des commits. Cela permet d'avoir des messages concis, faciles à lire et à comprendre.
Commits atomiques : Chaque commit doit être atomique, c'est-à-dire qu'il doit se concentrer sur une seule fonctionnalité ou un seul changement. Cela veut dire un commit par fichier modifié, supprimé ou ajouté au minimum.
Cela garantit une meilleure traçabilité et simplifie la gestion des erreurs.
Nom en anglais : Les titres des pull requests doivent être rédigés en anglais pour garantir une compréhension globale de l'équipe.
Ajout de labels : Chaque pull request doit inclure un ou plusieurs labels pour faciliter la gestion des PRs.
Les labels indiquent le type de changement.
Par exemple :
Nom des fichiers en français : Les noms des fichiers dans le projet doivent être en français pour garder une cohérence avec la langue principale du projet.
Utiliser le kebab-case : Les noms de fichiers doivent être écrits en kebab-case, c'est-à-dire tout en minuscules, avec des mots séparés par des tirets.
Exemple :
gestion-utilisateurs.js
verifier-email.md
Demandes de changements détaillées par les reviewers : Si un reviewer exige des modifications sur une pull request, il doit clairement spécifier dans un commentaire les changements à effectuer.
Le reviewer doit fournir une explication détaillée pour s'assurer que le contributeur comprend bien les modifications demandées. Cela favorise la transparence et permet à tous les membres de l'équipe de suivre l'évolution de la pull request.
Approbation partagée : Une pull request doit être validée par au moins un membre du groupe émetteur de la PR en question.
Nombre minimum de reviewers : Pour qu'une pull request soit fusionnée, elle doit être approuvée par un minimum de trois reviewers, y compris des membres externes au groupe émetteur, afin de garantir une évaluation complète et de qualité.
Validation du Tech Lead : Parmi les reviewers, le Tech Lead du groupe émetteur de la pull request doit obligatoirement faire partie des approbateurs. L'approbation finale du Tech Lead est nécessaire pour qu'un membre du groupe puisse procéder à la fusion. Il revient au Tech Lead de donner l'aval définitif, assurant que la pull request est prête à être intégrée dans la base de code principale.
Responsabilité lors de la fusion : Le tech lead qui approuve le merge d'une pull request est responsable de la fusion de celle-ci. En acceptant de fusionner la pull request, il accepte également de prendre la responsabilité en cas de problèmes futurs liés à cette pull request.
Interdiction pour l'émetteur de fusionner sa pull request : L'émetteur de la pull request n'est pas autorisé à fusionner sa propre pull request. Cela permet de garantir une validation externe par les autres membres du groupe ou par des reviewers indépendants, pour renforcer la qualité et la fiabilité des modifications apportées.
Annulation des approbations de pull requests lorsque de nouveaux commits sont poussés : La règle "Dismiss stale pull request approvals when new commits are pushed" doit être activée. Cela signifie que si des commits supplémentaires sont ajoutés à une pull request déjà approuvée, les approbations précédentes seront automatiquement révoquées. Cette règle garantit que les modifications récentes sont également examinées par les reviewers, assurant ainsi que l'évaluation de la pull request reste valide et à jour.
$ npm install
# développement
$ npm run start
# mode watch
$ npm run start:dev
# mode production
$ npm run start:prod
# tests unitaires
$ npm run test
# tests e2e
$ npm run test:e2e
# couverture de tests
$ npm run test:cov
# test de l'authentification
http://localhost:3000/test-auth
- aReynier
- AyoubLaroussi
- Boris betremieux
- Martial Floquet
- EnguerranSGG
- Gabriel Luthun
- Julien Beauchant
- Messa
- YohanF1245
- Justin Didelot
- Abdel
- POST
/guild
{
"uuid": "123456789012345678",
"name": "My Discord Server",
"memberCount": 100,
"configuration": {
"welcomeChannel": "123456789",
"prefix": "!",
"language": "fr"
}
}
- GET
/guild
- GET
/guild/:uuid
Example:/guild/123456789012345678
- PUT
/guild/:uuid
{
"uuid": "123456789012345678",
"name": "Updated Server Name",
"memberCount": 150,
"configuration": {
"welcomeChannel": "987654321",
"prefix": "?",
"language": "en"
}
}
- DELETE
/guild/:uuid
Example:/guild/123456789012345678
- POST
/campus
{
"name": "Valenciennes"
}
- GET
/campus
- GET
/campus/:uuid
Example:/campus/550e8400-e29b-41d4-a716-446655440000
- PUT
/campus/:uuid
{
"name": "Lille"
}
- DELETE
/campus/:uuid
Example:/campus/550e8400-e29b-41d4-a716-446655440000
- POST
/guilds-templates
{
"uuid": "123456789012345678",
"name": "Server Template",
}
- GET
/guilds-templates
- GET
/guilds-templates/:uuid
Example:/guilds-templates/123456789012345678
- PUT
/guilds-templates/:uuid
{
"name": "Updated Template Name",
}
- DELETE
/guilds-templates/:uuid
Example:/guilds-templates/123456789012345678
- POST
/channels
{
"name": "general",
"type": "text",
"channelPosition": 1
}
- GET
/channels
- GET
/channels/:uuid
Example:/channels/123456789012345678
- PUT
/channels/:uuid
{
"name": "announcements",
"type": "text",
"channelPosition": 2
}
- DELETE
/channels/:uuid
Example:/channels/123456789012345678
- POST
/promotions
{
"name": "Dev Web 2024",
"startDate": "2024-01-01T00:00:00.000Z",
"endDate": "2024-12-31T23:59:59.999Z"
}
- GET
/promotions
- GET
/promotions/:uuid
Example:/promotions/550e8400-e29b-41d4-a716-446655440000
- PUT
/promotions/:uuid
{
"name": "Dev Web 2024 - Updated",
"startDate": "2024-02-01T00:00:00.000Z",
"endDate": "2024-12-31T23:59:59.999Z"
}
- DELETE
/promotions/:uuid
Example:/promotions/550e8400-e29b-41d4-a716-446655440000
Note:
- All timestamps (
createdAt
,updatedAt
) are managed automatically - For Guild endpoints, the
uuid
must be a valid Discord server ID (17-20 digits) - For Campus endpoints, the
uuid
is automatically generated
- POST
/roles
{
"uuid": "123456789012345678",
"name": "Administrateur",
"color": "#FF0000",
"permissions": ["MANAGE_CHANNELS", "MANAGE_ROLES"],
"position": 1,
"uuid_guild": "987654321098765432"
}
- GET
/roles
- GET
/roles/:uuid
Example:/roles/123456789012345678
- PUT
/roles/:uuid
{
"name": "Super Admin",
"color": "#0000FF",
"permissions": ["ADMINISTRATOR"],
"position": 2
}
- DELETE
/roles/:uuid
Example:/roles/123456789012345678
- POST
/identification-requests
{
"uuidMember": "57bb2c9b-a472-408d-9b90-4a834da929d0",
"firstname": "Hidetaka",
"lastname": "Miyazaki",
"email": "hidetaka.miyazaki@from-software.com"
}
- GET
/identification-requests
- GET
/identification-requests/:uuid
Example:/identification-requests/57bb2c9b-a472-408d-9b90-4a834da929d0
- PUT
/identification-requests/:uuid
{
"uuidMember": "57bb2c9b-a472-408d-9b90-4a834da929d0",
"firstname": "Hidetaka",
"lastname": "Miyazaki",
"email": "hidetaka.miyazaki@from-software.jp"
}
- DELETE
/identification-requests/:uuid
Example:/identification-requests/57bb2c9b-a472-408d-9b90-4a834da929d0
- POST
/members-informations
{
"uuid-member": "123456789012345678",
"firstname": "Hidetaka",
"lastname": "Miyazaki",
"email": "hidetaka.miyazaki@from-software.com"
}
- GET
/members-informations
- GET
/members-informations/:uuid
Example:/members-informations/57bb2c9b-a472-408d-9b90-4a834da929d0
- PUT
/members-informations/:uuid
{
"uuid-member": "123456789012345678",
"firstname": "Hidetaka",
"lastname": "Miyazaki",
"email": "hidetaka.miyazaki@from-software.jp"
}
- DELETE
/members-informations/:uuid
Example:/members-informations/57bb2c9b-a472-408d-9b90-4a834da929d0
- POST
/categories
{
"uuid": "123456789012345678",
"uuidGuild": "987654321098765432",
"name": "General",
"position": 1
}
- GET
/categories
- GET
/categories/:uuid
Example:/categories/57bb2c9b-a472-408d-9b90-4a834da929d0
- PUT
/categories/:uuid
{
"uuid": "123456789012345678",
"uuidGuild": "987654321098765432",
"name": "Updated Category",
"position": 2
}
- DELETE
/categories/:uuid
Example:/categories/57bb2c9b-a472-408d-9b90-4a834da929d0
Note:
- All timestamps (
createdAt
,updatedAt
) are managed automatically - For Guild endpoints, the
uuid
must be a valid Discord server ID (17-20 digits) - For Campus endpoints, the
uuid
is automatically generated
- POST
/answers
{
"content": "Paris",
"isMultipleAnswer": false,
"questionUuid": "123e4567-e89b-12d3-a456-426614174000"
}
- GET
/answers
- GET
/answers/:uuid
Example:/answers/123e4567-e89b-12d3-a456-426614174000
- PUT
/answers/:uuid
{
"content": "Updated answer",
"isMultipleAnswer": true
}
- DELETE
/answers/:uuid
Example:/answers/123e4567-e89b-12d3-a456-426614174000
- POST
/comments
{
"content": "Très bon travail sur ce projet !",
"comment_status": "active",
"uuid_member": "123e4567-e89b-12d3-a456-426614174000",
"resource_uuid": "123e4567-e89b-12d3-a456-426614174000",
"user_uuid": "123e4567-e89b-12d3-a456-426614174000"
}
- GET
/comments
- GET
/comments/:uuid
Example:/comments/123e4567-e89b-12d3-a456-426614174000
- PATCH
/comments/:uuid
{
"content": "Contenu mis à jour",
"comment_status": "inactive"
}
- DELETE
/comments/:uuid
Example:/comments/123e4567-e89b-12d3-a456-426614174000
- POST
/courses
{
"name": "cda-vals-p4",
"isCertified": true,
"uuidGuild": "123456789012345678",
"uuidCategory": "123456789012345678"
}
- GET
/courses
- GET
/courses/:uuid
Example:/courses/123e4567-e89b-12d3-a456-426614174000
- PUT
/courses/:uuid
{
"name": "updated-course",
"isCertified": false
}
- DELETE
/courses/:uuid
Example:/courses/123e4567-e89b-12d3-a456-426614174000
- POST
/dashboardAccounts
{
"email": "test@example.com",
"password": "password123",
"uuid_discord": "123456789012345678"
}
- GET
/dashboardAccounts/:uuid_dashboard_account
Example:/dashboardAccounts/123e4567-e89b-12d3-a456-426614174000
- PUT
/dashboardAccounts/:uuid_dashboard_account
{
"email": "updated@example.com",
"password": "newpassword123"
}
- DELETE
/dashboardAccounts/:uuid_dashboard_account
Example:/dashboardAccounts/123e4567-e89b-12d3-a456-426614174000
- POST
/discord-users
{
"uuid_discord": "123456789012345678",
"discordUsername": "JohnDoe#1234",
"discriminator": "1234"
}
- GET
/discord-users
- GET
/discord-users/:uuid_discord
Example:/discord-users/123456789012345678
- PUT
/discord-users/:uuid_discord
{
"discordUsername": "UpdatedJohnDoe#1234",
"discriminator": "4321"
}
- DELETE
/discord-users/:uuid_discord
Example:/discord-users/123456789012345678
- POST
/members
{
"guild_username": "JohnDoe",
"xp": "100.00",
"level": 1,
"community_role": "Member",
"status": "Active",
"uuid_guild": "123456789012345678",
"uuid_discord": "123456789012345678"
}
- GET
/members
- GET
/members/:uuid
Example:/members/123e4567-e89b-12d3-a456-426614174000
- PATCH
/members/:uuid
{
"guild_username": "UpdatedUser",
"status": "Inactive",
"level": 2,
"xp": "200.00",
"community_role": "Moderator"
}
- DELETE
/members/:uuid
Example:/members/123e4567-e89b-12d3-a456-426614174000
- POST
/resources
{
"title": "Guide de démarrage",
"description": "Un guide complet pour démarrer avec le bot",
"content": "Voici les étapes pour configurer le bot...",
"status": "active",
"uuid_member": "123e4567-e89b-12d3-a456-426614174000"
}
- GET
/resources
- GET
/resources/:uuid
Example:/resources/123e4567-e89b-12d3-a456-426614174000
- PATCH
/resources/:uuid
{
"title": "Guide de démarrage mis à jour",
"description": "Guide mis à jour avec les nouvelles fonctionnalités",
"content": "Nouvelles étapes de configuration...",
"status": "inactive"
}
- DELETE
/resources/:uuid
Example:/resources/123e4567-e89b-12d3-a456-426614174000
- POST
/reports
{
"type": "resource",
"category": "inappropriate",
"reason": "Contenu offensant envers la communauté",
"uuid_resource": "123e4567-e89b-12d3-a456-426614174000",
"uuid_reporter": "323b07a1-7cea-4916-82a5-76ff201fa0e2"
}
- GET
/reports
- GET
/reports/:uuid_report
Example:/reports/123e4567-e89b-12d3-a456-426614174000
- PATCH
/reports/:uuid_report
{
"status": "resolved",
"reason": "Contenu mis à jour"
}
Note: Seuls les modérateurs peuvent mettre à jour les signalements.
- DELETE
/reports/:uuid_report
Example:/reports/123e4567-e89b-12d3-a456-426614174000
Note: Un utilisateur ne peut supprimer que ses propres signalements.
- POST
/questions
{
"content": "Quelle est la capitale de la France ?",
"isMultipleAnswer": false,
"uuidPoll": "123e4567-e89b-12d3-a456-426614174000"
}
- GET
/questions
- GET
/questions/:uuid
Example:/questions/123e4567-e89b-12d3-a456-426614174000
- PUT
/questions/:uuid
{
"content": "Quelle est la capitale de l'Italie ?",
"isMultipleAnswer": true
}
- DELETE
/questions/:uuid
Example:/questions/123e4567-e89b-12d3-a456-426614174000
- POST
/votes
{
"userId": "123e4567-e89b-12d3-a456-426614174000",
"itemId": "123e4567-e89b-12d3-a456-426614174000",
"voteType": "upvote"
}
- GET
/votes
- GET
/votes/:id
Example:/votes/123e4567-e89b-12d3-a456-426614174000
- PUT
/votes/:id
{
"voteType": "downvote",
"voteIsActive": true
}
- DELETE
/votes/:id
Example:/votes/123e4567-e89b-12d3-a456-426614174000
- POST
/xp-transactions
{
"transaction_type": "GAIN",
"source": "VOTE",
"transaction_value": "100.00",
"reason": "Vote positif sur une ressource",
"notes": "Ressource particulièrement utile",
"reference_type": "RESOURCE",
"reference_uuid": "123e4567-e89b-12d3-a456-426614174000",
"uuid_member": "123e4567-e89b-12d3-a456-426614174000"
}
- GET
/xp-transactions
- GET
/xp-transactions/member/:uuid_member
Example:/xp-transactions/member/123e4567-e89b-12d3-a456-426614174000
- GET
/xp-transactions/:uuid
Example:/xp-transactions/123e4567-e89b-12d3-a456-426614174000
Note: Les transactions XP ne peuvent pas être modifiées ou supprimées une fois créées pour maintenir l'intégrité des données.
- POST
/moderator-actions
- Corps de la requête :
{
"userId": "123e4567-e89b-12d3-a456-426614174001",
"actionType": "ban",
"reason": "Violation des règles de la communauté",
"duration": "24h",
"notes": "Récidive après deux avertissements"
}
- GET
/moderator-actions
- GET
/moderator-actions/:id
- Exemple :
/moderator-actions/123e4567-e89b-12d3-a456-426614174000
- PUT
/moderator-actions/:id
- Corps de la requête :
{
"reason": "Mise à jour de la raison",
"notes": "Notes additionnelles"
}
- DELETE
/moderator-actions/:id
- Exemple :
/moderator-actions/123e4567-e89b-12d3-a456-426614174000
- POST
/tags
- Corps de la requête :
{
"name": "JavaScript",
"description": "Langage de programmation pour le web"
}
- GET
/tags
- GET
/tags/:id
- Exemple :
/tags/550e8400-e29b-41d4-a716-446655440000
- PATCH
/tags/:id
- Corps de la requête :
{
"name": "JavaScript ES2022",
"description": "Dernière version du langage JavaScript"
}
- DELETE
/tags/:id
- Exemple :
/tags/550e8400-e29b-41d4-a716-446655440000