Skip to content
Snippets Groups Projects
Commit b2205111 authored by joel.vonderwe's avatar joel.vonderwe
Browse files

Add languages route and language in assignment creation

parent 17902b8c
No related branches found
No related tags found
No related merge requests found
Pipeline #30214 passed
......@@ -303,9 +303,21 @@ paths:
type: boolean
default: false
description: Whether or not to use the Sonar integration to validate the assignment and exercise solutions
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':
......@@ -445,6 +457,35 @@ paths:
$ref: '#/components/schemas/User'
default:
$ref: '#/components/responses/ERROR'
/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/{exerciseId}/assignment:
get:
tags:
......
-- AlterTable
ALTER TABLE `Assignment` ADD COLUMN `language` ENUM('abap', 'ada', 'asm', 'bash', 'bqn', 'c', 'caml', 'cloudformation', 'csharp', 'css', 'cuda', 'dart', 'delphi', 'docker', 'erlang', 'f', 'fsharp', 'flex', 'fortran', 'futhark', 'go', 'groovy', 'haskell', 'hepial', 'json', 'jsp', 'java', 'js', 'julia', 'kotlin', 'kubernetes', 'latex', 'lisp', 'lua', 'matlab', 'objc', 'ocaml', 'pascal', 'pearl', 'perl', 'php', 'postscript', 'powershell', 'prolog', 'promela', 'python', 'r', 'ruby', 'rust', 'scala', 'sql', 'smalltalk', 'swift', 'terraform', 'text', 'ts', 'tsql', 'typst', 'vba', 'vbnet', 'web', 'xml', 'yaml', 'other') NOT NULL DEFAULT 'other';
ALTER TABLE `Assignment` ADD COLUMN `language` ENUM('abap', 'ada', 'asm', 'bash', 'bqn', 'c', 'caml', 'cloudformation', 'cpp', 'csharp', 'css', 'cuda', 'dart', 'delphi', 'docker', 'erlang', 'f', 'fsharp', 'flex', 'fortran', 'futhark', 'go', 'groovy', 'haskell', 'hepial', 'json', 'jsp', 'java', 'js', 'julia', 'kotlin', 'kubernetes', 'latex', 'lisp', 'lua', 'matlab', 'objc', 'ocaml', 'pascal', 'pearl', 'perl', 'php', 'postscript', 'powershell', 'prolog', 'promela', 'python', 'r', 'ruby', 'rust', 'scala', 'sql', 'smalltalk', 'swift', 'terraform', 'text', 'ts', 'tsql', 'typst', 'vba', 'vbnet', 'web', 'xml', 'yaml', 'other') NOT NULL DEFAULT 'other';
......@@ -83,6 +83,7 @@ enum Language {
c
caml
cloudformation
cpp
csharp
css
cuda
......
......@@ -9,6 +9,7 @@ import Json5FileValidator from '../sha
import ExerciseResultsFile from '../shared/types/Dojo/ExerciseResultsFile';
import ParamsCallbackManager from '../middlewares/ParamsCallbackManager';
import ExerciseManager from '../managers/ExerciseManager';
import { Language } from '@prisma/client';
declare type DojoMeta = Meta & {
......@@ -134,6 +135,23 @@ class DojoValidators {
});
}
});
readonly supportedLanguageValidator = this.toValidatorSchemaOptions({
bail : true,
errorMessage: 'Unsupported language',
options : (_value, {
req,
path
}) => {
return new Promise((resolve, reject) => {
const language = this.getParamValue(req, path) as string;
if ( language ) {
(Object.values(Language).includes(language as keyof typeof Language) ? resolve(true) : reject());
}
reject();
});
}
});
}
......
......@@ -15,7 +15,7 @@ import GitlabRepository from '../shared/types/Gitlab/GitlabReposit
import { AxiosError, HttpStatusCode } from 'axios';
import logger from '../shared/logging/WinstonLogger';
import DojoValidators from '../helpers/DojoValidators';
import { Prisma } from '@prisma/client';
import { Language, Prisma } from '@prisma/client';
import db from '../helpers/DatabaseHelper';
import { Assignment } from '../types/DatabaseTypes';
import AssignmentManager from '../managers/AssignmentManager';
......@@ -49,6 +49,11 @@ class AssignmentRoutes implements RoutesManager {
notEmpty : true,
isBoolean: true,
},
language : {
trim : true,
notEmpty: true,
custom : DojoValidators.supportedLanguageValidator
}
};
private readonly assignmentAddCorrigeValidator: ExpressValidator.Schema = {
......@@ -60,6 +65,8 @@ class AssignmentRoutes implements RoutesManager {
};
registerOnBackend(backend: Express) {
backend.get('/assignments/languages', this.getLanguages.bind(this));
backend.get('/assignments/:assignmentNameOrUrl', SecurityMiddleware.check(true), this.getAssignment.bind(this));
backend.post('/assignments', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.assignmentValidator), this.createAssignment.bind(this));
......@@ -90,7 +97,7 @@ class AssignmentRoutes implements RoutesManager {
private async createAssignment(req: express.Request, res: express.Response) {
const params: {
name: string, members: Array<GitlabUser>, template: string, useSonar: string
name: string, members: Array<GitlabUser>, template: string, useSonar: string, language: string
} = req.body;
const useSonar = params.useSonar === 'true';
......@@ -159,6 +166,7 @@ class AssignmentRoutes implements RoutesManager {
gitlabLastInfo : repository as unknown as Prisma.JsonObject,
gitlabLastInfoDate: new Date(),
useSonar : useSonar,
language : Language[params.language as keyof typeof Language],
staff : {
connectOrCreate: [ ...params.members.map(gitlabUser => {
return {
......@@ -252,6 +260,10 @@ class AssignmentRoutes implements RoutesManager {
}
};
}
private async getLanguages(req: express.Request, res: express.Response) {
req.session.sendResponse(res, StatusCodes.OK, Object.values(Language));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment