Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • add_route_assignments
  • ask-user-to-delete-exercises-on-duplicates
  • bedran_exercise-list
  • jw_sonar
  • jw_sonar_backup
  • main
  • update-dependencies
  • v6.0.0
  • 2.0.0
  • 2.1.0
  • 2.2.0
  • 3.0.0
  • 3.0.1
  • 3.1.0
  • 3.1.1
  • 3.1.2
  • 3.1.3
  • 3.2.0
  • 3.3.0
  • 3.4.0
  • 3.4.1
  • 3.4.2
  • 3.5.0
  • 3.5.1
  • 3.5.2
  • 3.5.3
  • 4.0.0
  • 4.1.0
  • 5.0.0
  • 5.0.1
  • 6.0.0-dev
  • v1.0.1
32 results

Target

Select target project
  • Dojo_Project_Nguyen/backend/dojobackendapi
  • dojo_project/projects/backend/dojobackendapi
2 results
Select Git revision
Show changes
Commits on Source (143)
Showing
with 588 additions and 84 deletions
......@@ -7,6 +7,8 @@ ExpressAPI/src/config/Version.ts
redoc.html
OpenAPI.yaml-r
sonarlint.xml
sonarlint/
############################ MacOS
# General
......@@ -193,6 +195,7 @@ web_modules/
.flaskenv*
!.env.project
!.env.vault
!config.env
# parcel-bundler cache (https://parceljs.org/)
.cache
......
......@@ -14,6 +14,7 @@ variables:
PACKAGE_REGISTRY_URL: "${GITLAB_API_PROJECT_URL}/packages/generic/${PROJECT_NAME}"
WIKI_FOLDER: Wiki
.get_version:
......@@ -72,6 +73,36 @@ code_quality:lint:
- npm install
- npm run lint
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
- when: on_success
code_quality:sonarqube:
stage: code_quality
tags:
- code_quality
image:
name: leadrien/isc-sonar-scanner-cli
entrypoint: [ "" ]
variables:
SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
cache:
key: "${CI_JOB_NAME}"
paths:
- .sonar/cache
script:
- sonar-scanner
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
- when: on_success
test:build:
......@@ -84,7 +115,11 @@ test:build:
- npm install
- npm run build
rules:
- if: '$CI_COMMIT_TAG =~ "/^$/"'
- if: $CI_COMMIT_TAG
when: never
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
- when: on_success
clean:release:
......@@ -96,7 +131,7 @@ clean:release:
- !reference [.get_version, script]
- !reference [.clean_release, script]
rules:
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
- if: $CI_COMMIT_REF_PROTECTED == "true"
clean:packages:
......@@ -108,10 +143,10 @@ clean:packages:
- !reference [.get_version, script]
- !reference [.clean_packages, script]
rules:
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
- if: $CI_COMMIT_REF_PROTECTED == "true"
clean:dev:release:
clean:release:dev:
stage: clean
tags:
- gitlab_clean
......@@ -121,10 +156,10 @@ clean:dev:release:
- VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
- !reference [.clean_release, script]
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
clean:dev:packages:
clean:packages:dev:
stage: clean
tags:
- gitlab_clean
......@@ -134,10 +169,10 @@ clean:dev:packages:
- VERSION="${VERSION}${VERSION_DEV_SUFFIX}"
- !reference [.clean_packages, script]
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
upload:packages:wiki:
upload:packages:doc:wiki:
stage: upload
tags:
- gitlab_package
......@@ -157,10 +192,10 @@ upload:packages:wiki:
# Send package
- 'curl --header "JOB-TOKEN: $CI_JOB_TOKEN" --upload-file ${WIKI_ARCHIVE_PATH} "${PACKAGE_URL_WIKI}";'
rules:
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
- if: $CI_COMMIT_REF_PROTECTED == "true"
release:wiki:
release:doc:wiki:
stage: release
tags:
- release
......@@ -205,7 +240,7 @@ release:wiki:
# Push the change back to the master branch of the wiki
- git push origin "HEAD:main"
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
- when: never
release:gitlab:
......@@ -245,4 +280,4 @@ release:gitlab:
--header "JOB-TOKEN: $CI_JOB_TOKEN" \
--request POST "${GITLAB_API_PROJECT_URL}/releases"
rules:
- if: '$CI_COMMIT_REF_PROTECTED == "true"'
- if: $CI_COMMIT_REF_PROTECTED == "true"
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="migrated" value="true" />
<option name="pristineConfig" value="false" />
<option name="userId" value="104e8585:19002424fea:-7ffe" />
</MTProjectMetadataState>
</option>
<option name="titleBarState">
<MTProjectTitleBarConfigState>
<option name="overrideColor" value="false" />
</MTProjectTitleBarConfigState>
</option>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/dojobackendapi.iml" filepath="$PROJECT_DIR$/.idea/dojobackendapi.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$/ExpressAPI/src/shared" vcs="Git" />
</component>
</project>
\ No newline at end of file
......@@ -18,6 +18,66 @@
-->
## 6.0.0 (Upcoming)
### ✨ Feature
- Add SonarQube integration for exercises (thanks to @joel.vonderwe)
- Add routes to list exercises of a user (thanks to @bedran.sezer)
- Add routes to list available assignments (thanks to @bedran.sezer)
### 🔨 Internal / Developers
- Major dependencies update
## 5.0.1 (2025-02-25)
### 🐛 Bugfix
- Fix some bugs related to assignments / exercises deletion
### 🔨 Internal / Developers
- Adminer: Style migration to dracula theme
## 5.0.0 (2024-10-21)
### ✨ Feature
- Add possibility of self-host the solution
## 4.2.0 (2024-07-05)
### ✨ Feature
- Add support for tags on assignments and exercises (thanks to @vincent.steinman)
- Add possibility for user and staff to delete an exercise (thanks to @bedran.sezer)
## 4.1.0 (2024-05-28)
### ✨ Feature
- Add features related to corrige (commentary, commit specific link / update, delete link)
### 🎨 Interface
- Ask for confirmation before creating an exercise that already exists
## 4.0.0 (2024-04-19)
### ✨ Feature
- Add features related to corrige (commentary, commit specific link / update, delete link)
### 🔨 Internal / Developers
- Migration to GitBreaker library for all Gitlab API calls
- SonarQube integration
- Multi-process start is disabled where it is not in a production environment
### 🐛 Bugfix
- Fix no response when Authorization header is missing
- Fix get assignment by url with assignment containing spaces
### 📚 Documentation
- Corrige routes documentation
## 3.5.3 (2024-02-26)
### 🐛 Bugfix
......
#/-------------------.env.vault---------------------/
#/ cloud-agnostic vaulting standard /
#/ [how it works](https://dotenv.org/env-vault) /
#/ [how it works](https://dotenvx.com/env-vault) /
#/--------------------------------------------------/
# development
DOTENV_VAULT_DEVELOPMENT="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"
DOTENV_VAULT_DEVELOPMENT="pzItkUUDlX0G58tCsYeb3iPx8MJFv0Y45DKwvPi61kmj2GQdeQxizPJQyix0hjE/XR6lFJMiRNjLElI4fAK1Un+JtScTYRFIzpb9EHkfoE8opxYqyYjcj5TChI5RY574wv5zTvWfsjpYWA0J8dGaxfWMx9yHS/uMk3J1W3HEg7AXnLlYMR3gQDXfaWt3neJ9aZgEPNlprVve4xpXMhOBYWn0NjhrBF3u+bXL8rEZ5ki7ek98gXC1ADcjENulWZ/CaeTuYfprKxBiNCjyT7qHyVcz70XyIkie2v/wKf7FnoyHJlCU/kNLkafGcG16fKquvilhU9u1GcIICw8I81o2rXfJzkLOUFdle8V2U88olWDUEwxCFShBDJumMKh49RBiIpIgHKr3YwDp8/0oNnG0IQW/8PZMb9RoES2oYMzOOV4+RflvXqYE24Jfq6RM3s7PFSFjJYRS/D/rR8uOcyCUk1nQM3/R2x5Mzl2AKFpv3uzVvmKUSZ5khOfHrU3+BGX43m3hHT5esAKqhwHSTgnWnAVdA5H0mYo6ScCPQbEWFoV0TjovR5JZqaGV0AsKQOPuNBRTjJXGHcYfHZyfA0UBzth8cRAB6qIsTSfguE6IOhfyjhi3Jvh9pcbJA8yFc/xjMhbkfYDUsQO+sGCrOhgn15n2sBmF4HBjaEUX9RqgXAl0EZRUOUWdmR76SC6SNnzVqRSGqzqWBdTS/qXD41ju1xLy0u1XLBW7gVEnYqjK1DTEXCS+FTJHjbGNfAD4cA+v/jvbpuEITjfpxkG/PxrGpqzTwcrJ39R4JoLzS5OMB+VYiL2w94jyipZ9deBQBNZy/wzebCJjq6ckm+Q7rAaeRlkZWbfM4JcmMQmOO3jnVZPGEPP5pJiqqRz/z9AUlg5QJ9StNBlpDf3tj3LBXYfEvXs1J0lBukIDIoALuyruUd6bJtT/TjFiDRN8MBEJjs3tnsE1+AERggOaUXBtkuaUhMxxnZ3U4iSiWO//Jt6LNHcBRsQs+jlhfB6PwDn+eC8sOkMr0gM7AFQJvGfdwIrHc/WP/SWduuox9rB31VFtFtFk0dLRd6kpuxBAQDD8yxIp8gjlfs1t7a4HpE2yNPS985Ol0w27P2ayyoFq3L2TaWwixkfGS7KVTrn3ZkpfkSj3qAcchGI/YYSebFzLtzNYwlYywqVzPKm9ck/YJhsI+7SBzJyIB5vNWLl+RKw2IAp4SzZRdOowZXIhyrquNztXwTq7nzqAiTbl1HxZA7l/pLPu933tEqSAeoGMIB6eScy44kEyAdrEms6Q2bxh8/x0TN5qTx5K3w1EzQXh9CoGPElLobitazP6aeB77upY2ED5Zsdv4R4YKvQgLvgJ4WA1s5M4NgzKqKOPpUCYRUu8eTl+ubn0oSjeXkOLt9Vhv9JGNV8G5endJkvMvOX8doC0Pm/zHufm10kt77ng+uWpr6+Vrh4LJSzUTPD3pduWqBZUFP8kCoyHetydSodRxMIbH7wMfOCOS27woQFlUGfny9OS7lIrbVC413/QhObMbREM8Voip8sHGpOzi75pzoPReEHfzkEIpvm8mxUG5Tys/9ehTTjiB9/T6OsMgEDRs/Zm6WJst2xfpY7BXWCIYmw6P+tEuxxtt5PmznerCrunE+RN1jJZXs6hChsi/HQ/sk7RPs+XQP/ZHZ0LQJf/FlHPLseXIE3SRef00sQlVPnGlRDjF+KiRYKTIybJsd+r7im8J1At6yDL4L2rGQhEkF2x+rXUDJSb2FfFkMTlKfjSixLm21xOePbNfiHfumNUBXYYgKXXTgvy4Fxq3o8EwBGt+J+3O9j3n02voeTY/IOicfy/EyR5zpjLOq4P50Jlhl33cJJUALTqzvmTtvsWf23E5j5IiKZVTzju8eu5YLirVK8Hk0ZHCmLZYJP5zBuq4snO1lmM4WFP4oJBCA0J5eu7G+bhs2ifgLQFKCJkB4oYRcPkCAUoz7WY418="
# production
DOTENV_VAULT_PRODUCTION="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"
DOTENV_VAULT_PRODUCTION="GGYCEBZbOe74RxXkf0bCRQtdFvo7sodrZO95rfwvuEmVk7UwOemI491SjFeU9Vv1QFelMXnpoutzbRSDi5n2l0bmjfnx+dhlHcy6SvaNRBRg7bzlqrAFBD6vpd1I+642rQ0njf03qXS+shUKWpVUcE/5wa7OVm4N37jc9EM2C9cJSBDgZdP88pMX4MH+Fl+C/ejp+HH/HkvgTyZ7Ehw/+i5gtrx5IABSRNAm/Jjm7kKiS7bS0JlDfL8LYLIRxVhJKrJ9TxcgpXmYWY5cThbr8shMg8TTZLOfxUW1N8Kf5PRCiEduZ4kDaOcP7OmzLY2XXEMAeWwbYlAzd1GwJeDj8/jbh6ziSf7zI5f9ncDPX+msQ74ka3nh87spQJ8ak4gSSf01Gc+jhNiYOrrq8nL+HXuELvYoKLnlX9Q4e2mJFZccWgF7ubbDW+LTXf2VqUH0ErBRYG5+BJZ6eRDL13KoM0v7mTljmYNSn8v/omkSWwhUR5mBGHDyqgHDCWPHs8c2bwM+b3sj6mBeEZaMGwJxiGywmKzr9WaFwhHH+IgucUWshDU4HDQqlndDybuCGtrk8hgaZB4mDea1Gi4kVEiiOb1H802CaT76xEujriCzb02M1ADYXaAA/VBbfkKR4zAh1MGdccTVYZmb7FGNW9DNXuNdLxEGVu6hcmNDpefqc7myDXRDJAx6TrcIUR2pUq1fIeEhr7ofO10pAS8+X/d840XS43mWDZwVVKhn4ud8SW60X5JcVf7amIZYMdfvfu5VxgvbKiEAUhFMsWaHeuRtF9jKZkYGggyuUZqj5uHO/+IyZC45/5+WUnOCrC5LU2b0jzwJDYkcgefo5NmPrnFnseQhkZxGKNFdRIE7TBaBbb7617vm5vQvfaHSwmYhFYHQamYi0wAqlfDBxgXSuLVPsRcFkbnbGsOoxC9itMyiHpQpK2x0TVTQXU78KbaX1kL5uvL3Lq/Gr3Cq3Uj7BC1srpEWcUK0wi0y+6rxKrZ/vLxS/kVMBcNNBSFb3creS7xnZG7I/SRqFJYE3Yye0SR3T8jWxlsKZmW/PeN/vN0uzszURiL+nrodhMzLMXoiN4DC4fhTw4WsXtn8JjHWaC7MwWtVKN1Dw0l8iMUUrNB/uHcBC5dgVeFATy5/kydNQeDmoMjCaqCpiXP/2176qCysPSP1WeoZ84z/qPBh3t8chFLSlQ/Mzx4JUkGzI1k6gQOk5aCAZ+azA1uBIRSgjdR/9w5fMrFPENa/WCXV0pyFdRDgia3fy7Cbzt6KkG+zQSX/bRABnVT101UL8CXcmwo2bFi4qluQmHxpzJR9S9tCdnCKvwvMhyaNTvfocxbusRI4abOT9ilYwF6CQAqzHh8umlwLxADRnoYH2YtUwQBASp5ymXFR4whGenvvhZBgugmoGX+AkPlv877EJQlW48EuwenNBiHYjGdS8lsAM4NLaGkJfurhvhCYmb+zhTSgPGcUw5bFGkvahBLxkrnaP0kqoevp5JDX0vCF6Kc1nHX+vKRVurF/zWWuDyKOnQi+JzbsEMqEgiq26iLFZTqPyUSfTyG50Y8MVKYc4M5jcQ3NyIWoPtEeRxdmYgHRf20es32O2Rd/14YFBhx3Rkgo7d1BJniPArFWIevIAx9jgLHgRPB7FwlUN529eO2aKOx1Y5z7ma88QK36+Piq9zgkVNywsYXJxRfCNTTZZxAVaFav3ON8MHiiAnKSWcVqs3oCzfvHPD+LM1cZfs2tlX0jUOsUsEdWlOlVBd88ii4vaYXyAXEr7/Db3KHZNbOnYwalbhvWLhY1HwQ4l2kbe1CzIw0grbKXvRwE7UxlPV81Kjbrhuvnl2BrRdHX17iwegxqx15RzNU+KFc/UHZe7Furki4/4TC3wc5BXb2TNT3Kk4c+OH1AQ//lgIFGnF94a+kuD1U6B0TjQm+paacOK5L5D0JjkHX3Tm+PRxLEAZGy7sEL98WpB41CvRx7Xg/5XvU0qHzsxVSw"
# test
DOTENV_VAULT_TEST="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"
DOTENV_VAULT_TEST="mAPM9W/c0MfgDzYZYpfLAPDFI7kRKWP+VTgpKkx86sXRRQtFh9O6QdqLSxUuWjI2jwmTYOiiD5exEzYfbbGNJJC6dKx/47v2BIfmplsL3KcP5Sa+uicV/39eBBN3mL+yfoiHPLisFV1T1tfSFGNdzpMt+XVTsJG+024ypPaOOql6/33+ndhWmDtDnZ0UnHg06wjGikEzK6tEgXijdcxIw1HcQ48I8nfVpAESTNC9mySkp0ox3hlbLpchKchFDA9+MJJtJdZgLOHVUY1zXtue2cAif8++i7ytKqGQjeweTnEUSydujoceatT3O3sopbYWeLk2g/kzuMDgORC+cQ6tjI/s4o0q3WWgXv7pCiWwUvk0g+13Zm1MGY1nmim9b8NyURlPrgx56gfs/0SrVRyLtjn9Bc/+CGwy9KTssCrx+XrlTELBrMb+Oi1i/KX+ObgRZU3L0x/thuOAVj+k73/mqdJyK59irzZcAVvUENnRt0TULL3anrP84IsQY6CHH+hkIA6yZZ0B/5CT2wbD5UlgN2RHjGWzllo76AEI1C8qq830YXZ410tt/MICYKEndiSPLTs84Al1U8bO40SNczzwD0qYTrQK1zy51YifuO9DXUHdCdurzWUff2XAy1hOCB/z1I5WWgIfPG8JrAjcljIr4Nh15BQxpMmpiXUJi957XmecyCytKEsszCzmu9NNpVmVhh8+eQi/OBgOaupUrkzAM1jqK0FIiBVKuSGVy1cAiVjFBbjnzdchLcRPl0xgcOxZ/uiuZPjZHeLBORlWybOG02zZWI84GdJx2VrMcvHZmonVeskChNTU7FtztVdzTccdYZqm+zY8j3ls4/M/K09hCshCIjwEUuZw2YCFi2XnNPY3EIK7BghGueD/K5oPpNfcPr0b73pNNTUNPPqEMR2fXEquByAUzbXC012i6Sm4h3K5sd6T8SsP8qoKTjIjfiEH6oJAo7biQM4UWhtj8BF35ARMQEK91rUElWYi2OEJDs2yHnPYuSNsuUM/DLgKAh4pTy6YDZ+70HtDeg7H2FcIcHYf4UlnY7L3eQSCditXJEePC2qiEHyBmpoVFbzdv5PbM/O8YTv0/0k0spSY537PzuIahjIrHQDM/V7K0td1AnE6cJSxvv5hqYZAatCqUEGaYgIbKyU1lhYQxxwjEptz4ik5WON3kOrZ0OhmamelQISj1z9ojObD+DO+u6iZTeklJDpgFp6/KETo2Y7A5ywejVqzCfGBTlrE/P6CTs4frj5WE0Os4jdi9Xv4Jis5C0r9DnY1aUPKmKA5HNEk78oo1nudVsZiTDVccPSoGiVRKqzFyPpAoLvh8aRNIpBxbAFTwraeYQasbwuuzyc748lR3ltPqU/qNg7EPrBLTlwGvZ23Ed+EX67/Pg012Sd36JEiH2WUECs+7i2JdA2dPryiT+0Er6ep3dzm5cfX7bjdJ4kaLyAHcPCfMoIJdEJBlBzqfVtb8h1GYHN7hk5Zxzpdw3SrAElhsy+wLxn1RgyBg8bURVytjg+wCN+hpTReSd12qTpscn0SUyEGig8eF/t17wlCIUcPFxY6Q7o1Tpe6EI39TAYGhCGpLKh6t5dEeh1JKukgSIHSyF7EGHAkCNZVFNQKmT3FOoOVFFU59l8uPlrxilZYRqDjaJA6r18UusjPjAJsBFoZUxn3iDCexZSjjIwJ+lZVHyG8T/85gTcZDS8BgYyhDu1iy9p5+x08F7YRYWl1W0DiFWO626VtSs0QKCLW4fbYy6BcpHpfbxsEJBjxT+8PA+5xiAX8dF8HtYCVxN+LG8RTWT/CqeBBm2Hwd+b0Wluq/dbpcBVcaKO/fpuZRJwlAFTiZpcLWg1IJtYlaeSpZH0PNCbIUyahg3yRRie6vyG+H/s5fEgRof4TIzLaQsc+OikhosQuxtMAfz/UpRtP/bYjyhrfKT9B8wZBTkB7fKWdmc5RT2BmfX01JqWZn7LrhIxXNQxh/GWDh0IZRzNc6dYJ+eMc"
dist
node_modules
logs
prisma
\ No newline at end of file
{
"root" : true,
"parser" : "@typescript-eslint/parser",
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
]
}
\ No newline at end of file
......@@ -6,3 +6,5 @@
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# GitHub Copilot persisted chat sessions
/copilot/chatSessions
......@@ -15,4 +15,7 @@
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="SonarLintModuleSettings">
<option name="uniqueId" value="2749ea0f-74a8-42c0-9fd6-d6a4b4cd75a4" />
</component>
</module>
\ No newline at end of file
jetbrainsConfiguration/dataSources/
\ No newline at end of file
Subproject commit ffc5d65f9f0f0e825688177425e526131aa84631
Subproject commit ef5c7bd49a57bc28db77bad797de4980133d6523
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EslintConfiguration">
<custom-configuration-file used="false" path="eslint.config.mjs" />
<option name="fix-on-save" value="true" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="migrated" value="true" />
<option name="pristineConfig" value="false" />
<option name="userId" value="104e8585:19002424fea:-7ffe" />
</MTProjectMetadataState>
</option>
</component>
</project>
\ No newline at end of file
......@@ -2,6 +2,7 @@
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
<mapping directory="$PROJECT_DIR$/.idea/jetbrainsConfiguration" vcs="Git" />
<mapping directory="$PROJECT_DIR$/src/shared" vcs="Git" />
</component>
</project>
\ No newline at end of file
{
// Utilisez IntelliSense pour en savoir plus sur les attributs possibles.
// Pointez pour afficher la description des attributs existants.
// Pour plus d'informations, visitez : https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "tsx",
"type": "node",
"request": "launch",
// Debug current file in VSCode
"program": "src/app.ts",
/*
Path to tsx binary
Assuming locally installed
*/
"runtimeExecutable": "tsx",
/*
Open terminal when debugging starts (Optional)
Useful to see console.logs
*/
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
// Files to exclude from debugger (e.g. call stack)
"skipFiles": [
// Node.js internal core modules
"<node_internals>/**",
// Ignore all dependencies (optional)
"${workspaceFolder}/node_modules/**",
],
}
]
}
\ No newline at end of file
openapi: 3.1.0
info:
title: Dojo API
version: 3.5.3
version: 6.0.0
description: |
**Backend API of the Dojo project.**
......@@ -24,10 +24,12 @@ servers:
tags:
- name: General
description: ''
- name: Sonar
description: Routes that are used to manage SonarQube information
- name: Session
description: Routes that are used to manage the user's session
- name: Gitlab
description: Routes that are used to provide Gitlab informations
description: Routes that are used to provide Gitlab information
- name: Assignment
description: Routes that are used to manage assignments
- name: Exercise
......@@ -46,6 +48,127 @@ paths:
schema:
$ref: '#/components/schemas/DojoBackendResponse'
description: OK
/clients_config:
get:
tags:
- General
summary: Config of the clients
description: This route is used to get the configuration that clients (CLI, Checkers, etc.) need to operate.
responses:
'200':
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
properties:
gitlabUrl:
type: string
examples:
- https://gitedu.hesge.ch/
gitlabAccountId:
type: number
examples:
- 1076
gitlabAccountUsername:
type: string
examples:
- isc-dojo
loginGitlabClientId:
type: string
examples:
- 262b4d7c215233fa6fc91e70fb387a9314c02472dc3c6d22d6861fe93db6996a
required:
- gitlabUrl
- gitlabAccountId
- gitlabAccountUsername
- loginGitlabClientId
description: OK
default:
$ref: '#/components/responses/ERROR'
/sonar/info:
get:
tags:
- Sonar
summary: Check sonar status
description: This route can be used to check if the server supports sonar and if the integration is enabled.
responses:
'200':
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
properties:
sonarEnabled:
type: boolean
examples:
- true
languages:
type: array
items: string
examples:
- - c
- cpp
- js
description: OK
default:
$ref: '#/components/responses/ERROR'
/sonar/testqualities:
post:
tags:
- Sonar
summary: Test existence and validity of a quality gate and quality profiles
description: |
This route should be used at assignment creation to test existence and validity of a quality gate and quality profiles before creating the assignment
**🔒 Security needs:** TeachingStaff or Admin roles
security:
- Clients_Token: [ ]
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
gate:
type: string
profiles:
type: string
format: json
description: JSON string array of quality profiles
required:
- gate
- profiles
responses:
'200':
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
properties:
valid:
type: boolean
badGate:
type: string
description: Name of the gate if invalid, or null
badProfiles:
type: array
items: string
description: List of invalid profiles
description: OK
default:
$ref: '#/components/responses/ERROR'
/login:
......@@ -73,17 +196,7 @@ paths:
- refreshToken
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
nullable: true
$ref: '#/components/responses/OK'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
......@@ -274,8 +387,35 @@ paths:
type: string
format: url
description: URL of the template to use as base of the assignment
useSonar:
type: boolean
default: false
description: Whether or not to use the Sonar integration to validate the assignment and exercise solutions
sonarGate:
type: string
default: ""
description: Sonar quality gate to use for the assignment
sonarProfiles:
type: string
default: "[]"
description: Sonar quality profiles for the assignment, as a JSON array of strings
examples:
- "[\"Sonar Way\", \"ArchWeb Way\"]"
language:
type: string
default: other
description: Main programming language of the assignment
examples:
- java
- python
- csharp
- js
- c
- other
required:
- name
- language
- members
responses:
'200':
......@@ -306,17 +446,7 @@ paths:
- $ref: '#/components/parameters/assignmentNameOrUrl'
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
nullable: true
$ref: '#/components/responses/OK'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
......@@ -336,17 +466,93 @@ paths:
- $ref: '#/components/parameters/assignmentNameOrUrl'
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
nullable: true
$ref: '#/components/responses/OK'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
/assignments/{assignmentNameOrUrl}/corrections:
post:
tags:
- Assignment
summary: Link a exercise to an assignment as a correction
description: |
**🔒 Security needs:** TeachingStaff of the assignment or Admin role
security:
- Clients_Token: [ ]
parameters:
- $ref: '#/components/parameters/assignmentNameOrUrl'
requestBody:
content:
multipart/form-data:
schema:
allOf:
- type: object
properties:
exerciseIdOrUrl:
type: string
format: uuidv4
description: The id of the exercise to link
- $ref: '#/components/schemas/CorrectionsRequestBody'
required:
- exerciseIdOrUrl
responses:
'200':
$ref: '#/components/responses/OK'
'400':
$ref: '#/components/responses/BAD_REQUEST'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
/assignments/{assignmentNameOrUrl}/corrections/{exerciseIdOrUrl}:
patch:
tags:
- Assignment
summary: Update the correction link (f.e. commit SHA, description, etc.)
description: |
**🔒 Security needs:** TeachingStaff of the assignment or Admin role
security:
- Clients_Token: [ ]
parameters:
- $ref: '#/components/parameters/assignmentNameOrUrl'
- $ref: '#/components/parameters/exerciseIdOrUrl'
requestBody:
content:
multipart/form-data:
schema:
$ref: '#/components/schemas/CorrectionsRequestBody'
responses:
'200':
$ref: '#/components/responses/OK'
'400':
$ref: '#/components/responses/BAD_REQUEST'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
delete:
tags:
- Assignment
summary: Unlink a correction from an assignment
description: |
**🔒 Security needs:** TeachingStaff of the assignment or Admin role
security:
- Clients_Token: [ ]
parameters:
- $ref: '#/components/parameters/assignmentNameOrUrl'
- $ref: '#/components/parameters/exerciseIdOrUrl'
responses:
'200':
$ref: '#/components/responses/OK'
'400':
$ref: '#/components/responses/BAD_REQUEST'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
......@@ -415,7 +621,63 @@ paths:
$ref: '#/components/schemas/User'
default:
$ref: '#/components/responses/ERROR'
/exercises/{exerciseId}/assignment:
/assignments/languages:
get:
tags:
- Assignment
summary: Get all supported languages for assignments
description: |
This route can be used to get the list of all supported programming languages for which an assignment can be created.
security:
- Clients_Token: [ ]
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: array
items:
type: string
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
/exercises/{exerciseIdOrUrl}:
get:
tags:
- Exercise
summary: Get an exercise
security:
- ExerciseChecker_Secret: [ ]
parameters:
- $ref: '#/components/parameters/exerciseId'
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
$ref: '#/components/schemas/Exercise'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
/exercises/{exerciseIdOrUrl}/assignment:
get:
tags:
- Exercise
......@@ -424,7 +686,7 @@ paths:
security:
- ExerciseChecker_Secret: [ ]
parameters:
- $ref: '#/components/parameters/exerciseId'
- $ref: '#/components/parameters/exerciseIdOrUrl'
responses:
'200':
description: OK
......@@ -456,7 +718,7 @@ paths:
$ref: '#/components/responses/NOT_FOUND'
default:
$ref: '#/components/responses/ERROR'
/exercises/{exerciseId}/results:
/exercises/{exerciseIdOrUrl}/results:
post:
tags:
- Exercise
......@@ -464,7 +726,7 @@ paths:
security:
- ExerciseChecker_Secret: [ ]
parameters:
- $ref: '#/components/parameters/exerciseId'
- $ref: '#/components/parameters/exerciseIdOrUrl'
requestBody:
content:
multipart/form-data:
......@@ -504,17 +766,7 @@ paths:
- archiveBase64
responses:
'200':
description: OK
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/DojoBackendResponse'
- type: object
properties:
data:
type: object
nullable: true
$ref: '#/components/responses/OK'
'401':
$ref: '#/components/responses/UNAUTHORIZED'
'404':
......@@ -548,8 +800,8 @@ components:
required: true
schema:
type: string
exerciseId:
name: exerciseId
exerciseIdOrUrl:
name: exerciseIdOrUrl
description: The id of an exercise.
in: path
required: true
......@@ -557,6 +809,19 @@ components:
type: string
format: uuidv4
schemas:
CorrectionsRequestBody:
type: object
properties:
description:
type: string
description: Short (max. 80 characters) description of the correction
commit:
type: string
format: Commit SHA
description: Long or short commit id (if not set, take the last commit)
externalDocs:
description: Commit SHA
url: https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/about-commits
DojoBackendResponse:
type: object
properties:
......@@ -678,6 +943,20 @@ components:
type: boolean
examples:
- true
useSonar:
type: boolean
examples:
- true
sonarKey:
type: string
examples:
- dojodev_assignment_test-assignment-3_AY6etdT5SXprmuY6IlgR
sonarCreationInfo:
type: object
properties: { }
externalDocs:
description: Sonar project object
url: https://next.sonarqube.com/sonarqube/web_api/api/projects/search
staff:
type: array
items:
......@@ -694,6 +973,7 @@ components:
- gitlabLastInfo
- gitlabLastInfoDate
- published
- useSonar
- staff
- exercises
Exercise:
......@@ -736,6 +1016,16 @@ components:
type: string
examples:
- '1992-09-30 19:00:00.000'
sonarKey:
type: string
examples:
- dojodev_exercise_dojo-ex_test-assignment-6_dfddde9f-4288-460d-bf6e-67acc125355b_AY9OL1g7SXprmuY6ImSE
sonarCreationInfo:
type: object
properties: { }
externalDocs:
description: Sonar project object
url: https://next.sonarqube.com/sonarqube/web_api/api/projects/search
required:
- id
- assignmentName
......@@ -848,6 +1138,30 @@ components:
sessionToken: JWT token (for content, see schema named 'SessionTokenJWT')
data: null
responses:
OK:
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/DojoBackendResponse'
example:
timestamp: '1992-09-30T19:00:00.000Z'
code: 200
description: OK
sessionToken: JWT token (for content, see schema named 'SessionTokenJWT')
data: null
BAD_REQUEST:
description: BAD_REQUEST
content:
application/json:
schema:
$ref: '#/components/schemas/DojoBackendResponse'
example:
timestamp: '1992-09-30T19:00:00.000Z'
code: 400
description: BAD_REQUEST
sessionToken: JWT token (for content, see schema named 'SessionTokenJWT')
data: null
UNAUTHORIZED:
description: UNAUTHORIZED
content:
......