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
  • 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
Show changes
import { Express } from 'express-serve-static-core';
import express from 'express';
import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager';
import SharedSonarManager from '../shared/managers/SharedSonarManager';
import SonarManager from '../managers/SonarManager';
import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import SecurityCheckType from '../types/SecurityCheckType';
import * as ExpressValidator from 'express-validator';
import DojoValidators from '../helpers/DojoValidators';
import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
class SonarRoutes implements RoutesManager {
private readonly qualitiesValidator: ExpressValidator.Schema = {
gate : {
trim : true,
notEmpty: false
},
profiles : {
trim : true,
notEmpty : false,
customSanitizer: DojoValidators.jsonSanitizer
}
};
registerOnBackend(backend: Express) {
backend.get('/sonar/info', this.sonar.bind(this));
backend.post('/sonar/testqualities', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.qualitiesValidator), this.testQualities.bind(this));
}
private async sonar(req: express.Request, res: express.Response) {
const data = {
sonarEnabled: await SharedSonarManager.isSonarSupported(),
languages: await SonarManager.getLanguages()
};
return req.session.sendResponse(res, StatusCodes.OK, data);
}
private async testQualities(req: express.Request, res: express.Response) {
const params: {
gate: string | undefined, profiles: string[]
} = req.body;
console.log(params);
let gateOk = true;
if ((params.gate ?? "") !== "") {
gateOk = await SonarManager.testQualityGate(params.gate ?? "")
}
let profilesOk = true;
const badProfiles = [];
for ( const profile of params.profiles ) {
try {
const [ lang, name ] = profile.trim().split('/');
if ( !await SonarManager.testQualityProfile(name, lang) ) {
profilesOk = false;
badProfiles.push(profile);
}
} catch (e) {
profilesOk = false;
badProfiles.push(profile);
}
}
console.log(gateOk, profilesOk);
const data = {
valid: gateOk && profilesOk,
badProfiles: badProfiles,
badGate: (gateOk ? null : params.gate)
};
console.log(data);
return req.session.sendResponse(res, StatusCodes.OK, data);
}
}
export default new SonarRoutes();
import express, { RequestHandler } from 'express';
import { TagType } from '@prisma/client';
import * as ExpressValidator from 'express-validator';
import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager';
import { Express } from 'express-serve-static-core';
import db from '../helpers/DatabaseHelper';
import SecurityCheckType from '../types/SecurityCheckType';
import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
import DojoStatusCode from '../shared/types/Dojo/DojoStatusCode';
class TagRoutes implements RoutesManager {
private readonly tagValidator: ExpressValidator.Schema = {
name: {
trim : true,
notEmpty: true
},
type: {
trim : true,
notEmpty: true
}
};
private readonly tagProposalAnswerValidator: ExpressValidator.Schema = {
state : {
trim : true,
notEmpty: true
},
details: {
trim : true,
optional: true
}
};
registerOnBackend(backend: Express) {
backend.post('/tags', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagValidator), this.createTag.bind(this) as RequestHandler);
backend.delete('/tags/:tagName', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), this.deleteTag.bind(this) as RequestHandler);
backend.get('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), this.getTagProposals.bind(this) as RequestHandler);
backend.post('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagValidator), this.createTagProposal.bind(this) as RequestHandler);
backend.patch('/tags/proposals/:tagProposalName', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagProposalAnswerValidator), this.validateTag.bind(this) as RequestHandler);
}
private async createTag(req: express.Request, res: express.Response) {
const tagName = req.body.name;
const tagType = (req.body.type as string).toUpperCase() as TagType;
if ( tagType !== TagType.USERDEFINED && !req.session.profile.isAdmin ) {
return req.session.sendResponse(res, StatusCodes.FORBIDDEN, {}, 'Only admins can create non userDefined tags', DojoStatusCode.TAG_ONLY_ADMIN_CREATION);
}
await db.tag.create({
data: {
name: tagName,
type: tagType
}
});
return req.session.sendResponse(res, StatusCodes.OK);
}
private async deleteTag(req: express.Request, res: express.Response) {
if ( req.boundParams.tag!.assignments.length > 0 ) {
return req.session.sendResponse(res, StatusCodes.LOCKED, {}, 'Tag is used in assignments', DojoStatusCode.TAG_WITH_ACTIVE_LINK_DELETION);
}
await db.tag.delete({
where: { name: req.boundParams.tag!.name }
});
return req.session.sendResponse(res, StatusCodes.OK);
}
private async getTagProposals(req: express.Request, res: express.Response) {
const state = req.query.stateFilter as string;
const tagProposals = await db.tagProposal.findMany(state ? {
where: { state: state }
} : {});
return req.session.sendResponse(res, StatusCodes.OK, tagProposals);
}
private async createTagProposal(req: express.Request, res: express.Response) {
const tagName = req.body.name;
const tagType = (req.body.type as string).toUpperCase() as TagType;
await db.tagProposal.create({
data: {
name: tagName,
type: tagType
}
});
return req.session.sendResponse(res, StatusCodes.OK);
}
private async validateTag(req: express.Request, res: express.Response) {
if ( req.boundParams.tagProposal!.state === 'PendingApproval' ) {
const state: string = req.body.state;
if ( state === 'Approved' ) {
try {
await db.tag.create({
data: {
name: req.boundParams.tagProposal!.name,
type: req.boundParams.tagProposal!.type
}
});
} catch ( error ) {
// empty
}
}
await db.tagProposal.update({
where: { name: req.boundParams.tagProposal?.name },
data : {
state : state,
details: req.body.details ?? ''
}
});
return req.session.sendResponse(res, StatusCodes.OK);
} else {
return req.session.sendResponse(res, StatusCodes.BAD_REQUEST, {}, 'Tag proposal is not pending', DojoStatusCode.TAG_PROPOSAL_ANSWER_NOT_PENDING);
}
}
}
export default new TagRoutes();
import { Express } from 'express-serve-static-core';
import express, { RequestHandler } from 'express';
import { StatusCodes } from 'http-status-codes';
import RoutesManager from '../express/RoutesManager.js';
import SecurityMiddleware from '../middlewares/SecurityMiddleware';
import * as ExpressValidator from 'express-validator';
import ParamsValidatorMiddleware from '../middlewares/ParamsValidatorMiddleware';
import { Prisma, UserRole } from '@prisma/client';
import UserManager from '../managers/UserManager';
class UserRoutes implements RoutesManager {
private readonly usersGetValidator: ExpressValidator.Schema = {
role: {
trim : true,
notEmpty: false,
optional: true
}
};
registerOnBackend(backend: Express) {
backend.get('/users', SecurityMiddleware.check(true), ParamsValidatorMiddleware.validate(this.usersGetValidator), this.getUsers.bind(this) as RequestHandler);
}
private async getUsers(req: express.Request, res: express.Response) {
let roleFilter: Prisma.UserWhereInput | undefined = undefined;
if ( req.query.role ) {
if ( req.query.role === UserRole.ADMIN ) {
roleFilter = {
role: UserRole.ADMIN
};
} else if ( req.query.role === UserRole.TEACHING_STAFF ) {
roleFilter = {
OR: [ {
role: UserRole.ADMIN
}, {
role: UserRole.TEACHING_STAFF
} ]
};
} else if ( req.query.role === UserRole.STUDENT ) {
roleFilter = {
role: UserRole.STUDENT
};
} else {
return req.session.sendResponse(res, StatusCodes.FORBIDDEN);
}
} else if ( !req.session.profile.isAdmin ) {
return req.session.sendResponse(res, StatusCodes.FORBIDDEN);
}
return req.session.sendResponse(res, StatusCodes.OK, await UserManager.getFiltered(roleFilter));
}
}
export default new UserRoutes();
Subproject commit 9e3f29d2f313ef96944a199da0db39f1827c496a
Subproject commit 937081e68f6127b669daca30e57c43e73b9c96c9
import { Prisma } from '@prisma/client';
import LazyVal from '../shared/helpers/LazyVal';
import GitlabUser from '../shared/types/Gitlab/GitlabUser';
import LazyVal from '../shared/helpers/LazyVal.js';
import * as Gitlab from '@gitbeaker/rest';
const userBase = Prisma.validator<Prisma.UserDefaultArgs>()({
......@@ -9,14 +9,16 @@ const userBase = Prisma.validator<Prisma.UserDefaultArgs>()({
const assignmentBase = Prisma.validator<Prisma.AssignmentDefaultArgs>()({
include: {
exercises: true,
staff : true
staff : true,
tags : true
}
});
const exerciseBase = Prisma.validator<Prisma.ExerciseDefaultArgs>()({
include: {
assignment: true,
members : true,
results : true
results : true,
tags : true
}
});
const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({
......@@ -24,12 +26,18 @@ const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({
exercise: true
}
});
const tagBase = Prisma.validator<Prisma.TagDefaultArgs>()({
include: {
exercises : true,
assignments: true
}
});
export type User = Prisma.UserGetPayload<typeof userBase> & {
isTeachingStaff: boolean
isAdmin: boolean
gitlabProfile: LazyVal<GitlabUser>
gitlabProfile: LazyVal<Gitlab.UserSchema>
}
export type Exercise = Prisma.ExerciseGetPayload<typeof exerciseBase> & {
isCorrection: boolean
......@@ -38,3 +46,4 @@ export type Assignment = Prisma.AssignmentGetPayload<typeof assignmentBase> & {
corrections: LazyVal<Array<Exercise>>
}
export type Result = Prisma.ResultGetPayload<typeof resultBase>
export type Tag = Prisma.TagGetPayload<typeof tagBase>
\ No newline at end of file
enum SecurityCheckType {
TEACHING_STAFF = 'teachingStaff',
ADMIN = 'admin',
EXERCISE_MEMBERS = 'exerciseMembers',
ASSIGNMENT_STAFF = 'assignmentStaff',
ASSIGNMENT_IS_PUBLISHED = 'assignmentIsPublished',
EXERCISE_SECRET = 'exerciseSecret',
ASSIGNMENT_SECRET = 'assignmentSecret',
USER = 'user',
}
......
import Session from '../../controllers/Session';
import { Assignment, Exercise } from '../DatabaseTypes';
import Session from '../../controllers/Session.js';
import { Assignment, Exercise, Tag, User } from '../DatabaseTypes';
import { TagProposal } from '@prisma/client';
// to make the file a module and avoid the TypeScript error
export {};
......@@ -9,7 +10,7 @@ declare global {
export interface Request {
session: Session,
boundParams: {
assignment: Assignment | undefined, exercise: Exercise | undefined
user: User | undefined, assignment: Assignment | undefined, exercise: Exercise | undefined, tag: Tag | undefined, tagProposal: TagProposal | undefined
}
}
}
......
This diff is collapsed.
......@@ -22,6 +22,7 @@ services:
- ADMINER_DEFAULT_SERVER=dojo-database
- TZ=Europe/Zurich
- ADMINER_PLUGINS=dump-alter dump-bz2 dump-date dump-json dump-xml dump-zip edit-foreign edit-textarea foreign-system json-column sql-log struct-comments tables-filter
- ADMINER_DESIGN=dracula
networks:
dojo-network:
aliases:
......
This diff is collapsed.
This diff is collapsed.
sonar.projectKey=DojoBackendAPI
sonar.qualitygate.wait=true
sonar.exclusions=ExpressAPI/prisma/seed.ts
\ No newline at end of file