Skip to content
Snippets Groups Projects
Commit 9c66346c authored by vincent.steinman's avatar vincent.steinman Committed by michael.minelli
Browse files

Most of the structure

parent ca14979e
Branches
Tags
No related merge requests found
...@@ -72,3 +72,8 @@ model Result { ...@@ -72,3 +72,8 @@ model Result {
@@id([exerciseId, dateTime]) @@id([exerciseId, dateTime])
} }
model Tag {
name String @id @db.Char(36)
type Json @db.Json
}
\ No newline at end of file
...@@ -3,6 +3,7 @@ import express from 'express'; ...@@ -3,6 +3,7 @@ import express from 'express';
import { StatusCodes } from 'http-status-codes'; import { StatusCodes } from 'http-status-codes';
import ExerciseManager from '../managers/ExerciseManager.js'; import ExerciseManager from '../managers/ExerciseManager.js';
import AssignmentManager from '../managers/AssignmentManager.js'; import AssignmentManager from '../managers/AssignmentManager.js';
import TagsManager from 'src/managers/TagsManager';
type GetFunction = (id: string | number, ...args: Array<unknown>) => Promise<unknown> type GetFunction = (id: string | number, ...args: Array<unknown>) => Promise<unknown>
...@@ -28,7 +29,8 @@ class ParamsCallbackManager { ...@@ -28,7 +29,8 @@ class ParamsCallbackManager {
if ( !req.boundParams ) { if ( !req.boundParams ) {
req.boundParams = { req.boundParams = {
assignment: undefined, assignment: undefined,
exercise : undefined exercise : undefined,
tag : undefined
}; };
} }
} }
...@@ -44,6 +46,15 @@ class ParamsCallbackManager { ...@@ -44,6 +46,15 @@ class ParamsCallbackManager {
members : true, members : true,
results : true results : true
} ], 'exercise'); } ], 'exercise');
//Patch? Delete? à la place de .get
this.listenParam('tagId', backend, (TagsManager.get as GetFunction).bind(TagsManager), [ {
} ], 'tag');
this.listenParam('tagProposalName', backend, (TagsManager.get as GetFunction).bind(TagsManager), [ {
} ], 'tag');
} }
} }
......
...@@ -13,6 +13,8 @@ class SecurityMiddleware { ...@@ -13,6 +13,8 @@ class SecurityMiddleware {
private async checkType(checkType: SecurityCheckType, req: express.Request): Promise<boolean> { private async checkType(checkType: SecurityCheckType, req: express.Request): Promise<boolean> {
try { try {
switch ( String(checkType) ) { switch ( String(checkType) ) {
case SecurityCheckType.ADMIN.valueOf():
return req.session.profile.isAdmin;
case SecurityCheckType.TEACHING_STAFF.valueOf(): case SecurityCheckType.TEACHING_STAFF.valueOf():
return req.session.profile.isTeachingStaff; return req.session.profile.isTeachingStaff;
case SecurityCheckType.ASSIGNMENT_STAFF.valueOf(): case SecurityCheckType.ASSIGNMENT_STAFF.valueOf():
......
...@@ -33,12 +33,16 @@ class TagRoutes implements RoutesManager { ...@@ -33,12 +33,16 @@ class TagRoutes implements RoutesManager {
name: { name: {
trim: true, trim: true,
notEmpty: true notEmpty: true
},
type: {
trim: true,
notEmpty: true
} }
}; };
registerOnBackend(backend: Express) { registerOnBackend(backend: Express) {
backend.post('/tags', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagsValidator), this.addTag.bind(this)); backend.post('/tags', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagsValidator), this.addTag.bind(this));
backend.delete('/tags/:tagid', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.deleteTag.bind(this)); backend.delete('/tags/:tagId', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.deleteTag.bind(this));
backend.get('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.getSubmittedTag.bind(this)); backend.get('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.getSubmittedTag.bind(this));
backend.post('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagsValidator), this.SubmitTag.bind(this)); backend.post('/tags/proposals', SecurityMiddleware.check(true, SecurityCheckType.TEACHING_STAFF), ParamsValidatorMiddleware.validate(this.tagsValidator), this.SubmitTag.bind(this));
backend.patch('/tags/proposals/:tagProposalName', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.validateTag.bind(this)); backend.patch('/tags/proposals/:tagProposalName', SecurityMiddleware.check(true, SecurityCheckType.ADMIN), ParamsValidatorMiddleware.validate(this.tagsValidator), this.validateTag.bind(this));
...@@ -51,7 +55,39 @@ class TagRoutes implements RoutesManager { ...@@ -51,7 +55,39 @@ class TagRoutes implements RoutesManager {
} }
private async getSubmittedTag(req: express.Request, res: express.Response) { private async getSubmittedTag(req: express.Request, res: express.Response) {
const repoTree: Array<GitlabTreeFile> = await GitlabManager.getRepositoryTree(req.boundParams.exercise!.assignment.gitlabId);
let assignmentHjsonFile!: GitlabFile;
const immutableFiles: Array<GitlabFile> = await Promise.all(Config.assignment.baseFiles.map(async (baseFile: string) => {
const file = await GitlabManager.getFile(req.boundParams.exercise!.assignment.gitlabId, baseFile);
if ( baseFile === Config.assignment.filename ) {
assignmentHjsonFile = file;
}
return file;
}));
const dojoAssignmentFile: AssignmentFile = JSON5.parse(atob(assignmentHjsonFile.content)) as AssignmentFile;
const immutablePaths = dojoAssignmentFile.immutable.map(fileDescriptor => fileDescriptor.path);
await Promise.all(repoTree.map(async gitlabTreeFile => {
if ( gitlabTreeFile.type == GitlabTreeFileType.BLOB ) {
for ( const immutablePath of immutablePaths ) {
if ( gitlabTreeFile.path.startsWith(immutablePath) ) {
immutableFiles.push(await GitlabManager.getFile(req.boundParams.exercise!.assignment.gitlabId, gitlabTreeFile.path));
break;
}
}
}
}));
return req.session.sendResponse(res, StatusCodes.OK, {
assignment : (req.boundParams.exercise as Exercise).assignment,
assignmentFile: dojoAssignmentFile,
immutable : immutableFiles
});
} }
private async SubmitTag(req: express.Request, res: express.Response) { private async SubmitTag(req: express.Request, res: express.Response) {
......
...@@ -24,12 +24,12 @@ const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({ ...@@ -24,12 +24,12 @@ const resultBase = Prisma.validator<Prisma.ResultDefaultArgs>()({
exercise: true exercise: true
} }
}); });
// const tagsBase = Prisma.validator<Prisma.TagsDefaultArgs>()({ const tagsBase = Prisma.validator<Prisma.TagsDefaultArgs>()({
// include: { include: {
// name: true, name: true,
// type: true, type: true,
// } }
// }); });
export type User = Prisma.UserGetPayload<typeof userBase> & { export type User = Prisma.UserGetPayload<typeof userBase> & {
...@@ -44,4 +44,4 @@ export type Assignment = Prisma.AssignmentGetPayload<typeof assignmentBase> & { ...@@ -44,4 +44,4 @@ export type Assignment = Prisma.AssignmentGetPayload<typeof assignmentBase> & {
corrections: LazyVal<Array<Exercise>> corrections: LazyVal<Array<Exercise>>
} }
export type Result = Prisma.ResultGetPayload<typeof resultBase> export type Result = Prisma.ResultGetPayload<typeof resultBase>
// export type Tags = Prisma.ResultGetPayload<typeof tagsBase> export type Tags = Prisma.TagGetPayload<typeof tagsBase>
\ No newline at end of file \ No newline at end of file
import Session from '../../controllers/Session.js'; import Session from '../../controllers/Session.js';
import { Assignment, Exercise } from '../DatabaseTypes.js'; import { Assignment, Exercise, Tags } from '../DatabaseTypes';
// to make the file a module and avoid the TypeScript error // to make the file a module and avoid the TypeScript error
export {}; export {};
...@@ -9,7 +9,7 @@ declare global { ...@@ -9,7 +9,7 @@ declare global {
export interface Request { export interface Request {
session: Session, session: Session,
boundParams: { boundParams: {
assignment: Assignment | undefined, exercise: Exercise | undefined assignment: Assignment | undefined, exercise: Exercise | undefined, tag: Tags | undefined
} }
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment