Skip to content

Commit 62e9bad

Browse files
authored
Merge branch 'develop' into codeownersbot/update-CODEOWNERS-file-5d2cafd
2 parents e670221 + cd14f28 commit 62e9bad

26 files changed

Lines changed: 586 additions & 366 deletions

back-end/package-lock.json

Lines changed: 151 additions & 165 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

back-end/package.json

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
"dependencies": {
2525
"@nestjs/cli": "^9.5.0",
2626
"@nestjs/common": "^9.4.2",
27-
"@nestjs/config": "^2.3.2",
27+
"@nestjs/config": "^2.3.4",
2828
"@nestjs/core": "^9.4.2",
2929
"@nestjs/event-emitter": "^1.4.1",
3030
"@nestjs/jwt": "^10.0.3",
3131
"@nestjs/passport": "^9.0.3",
32-
"@nestjs/platform-express": "^9.4.2",
33-
"@nestjs/platform-socket.io": "^9.4.2",
32+
"@nestjs/platform-express": "^9.4.3",
33+
"@nestjs/platform-socket.io": "^9.4.3",
3434
"@nestjs/schedule": "^2.2.2",
3535
"@nestjs/websockets": "^9.4.2",
3636
"argon2": "^0.30.3",
@@ -47,7 +47,6 @@
4747
"pug": "^3.0.2",
4848
"reflect-metadata": "^0.1.13",
4949
"rimraf": "^5.0.1",
50-
"sharp": "^0.32.1",
5150
"rxjs": "^7.8.1",
5251
"sharp": "^0.32.1",
5352
"socket.io": "^4.6.1"

back-end/src/base/calls/calls.controller.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,11 @@ export class CallsController {
129129
async isProductOwner(@Jwt() userId: ObjectId, @Res() res: Response) {
130130
return res.status(201).json({ isProductOwner: true });
131131
}
132+
133+
@Get('/is_pedagogue')
134+
@UseGuards(JwtAuthGuard, new RoleValidator(Roles.PEDAGOGUE))
135+
async IsPedagogue(@Jwt() userId: ObjectId, @Res() res: Response) {
136+
console.log(Roles.PEDAGOGUE);
137+
return res.status(201).json({ isPedagogue: true });
138+
}
132139
}

back-end/src/base/groups/groups.service.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ export class GroupsService {
3333

3434
//TODO: Waiting for the trello part
3535
const retro = createRetroGroup(course, user);
36-
course.groups.forEach(async (groups, index) => {
36+
await this.deleteCourseRetro(courseId);
37+
await this.emptyCourseProjects(courseId);
38+
for (const groups of course.groups) {
39+
const index = course.groups.indexOf(groups);
3740
const projectDocument: CanvasRoom = {
3841
owner: userId,
3942
meta: {
@@ -57,12 +60,24 @@ export class GroupsService {
5760
{ _id: new ObjectId(courseId) },
5861
{ $push: { projects: canvas.insertedId } },
5962
);
60-
});
63+
}
6164

6265
const newRetro = await this.retrospectiveRepository.createRetrospective(retro);
6366
await this.coursesRepository.updateOneCourse(
6467
{ _id: new ObjectId(courseId) },
6568
{ $set: { retro: newRetro.insertedId, isLocked: true } },
6669
);
6770
}
71+
async emptyCourseProjects(courseId: string) {
72+
await this.coursesRepository.updateOneCourse(
73+
{ _id: new ObjectId(courseId) },
74+
{ $set: { projects: [] } },
75+
);
76+
}
77+
async deleteCourseRetro(courseId: string) {
78+
await this.coursesRepository.updateOneCourse(
79+
{ _id: new ObjectId(courseId) },
80+
{ $set: { retro: null } },
81+
);
82+
}
6883
}

back-end/src/base/ideasComments/ideasComments.module.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,18 @@ import { UsersRepository } from 'src/base/users/users.repository';
77
import { IdeasCommentsRepository } from 'src/base/ideasComments/ideasComments.repository';
88
import { IdeasCommentsService } from 'src/base/ideasComments/ideasComments.service';
99
import { IdeasCommentsController } from 'src/base/ideasComments/ideasComments.controller';
10+
import { IdeasCommentGateway } from '@/common/gateways/ideasComment.global.gateway';
11+
import { JwtService } from '@nestjs/jwt';
1012

1113
@Module({
1214
imports: [DatabaseModule, forwardRef(() => AuthModule)],
13-
providers: [IdeasCommentsService, IdeasCommentsRepository, UsersRepository],
15+
providers: [
16+
IdeasCommentsService,
17+
IdeasCommentsRepository,
18+
UsersRepository,
19+
IdeasCommentGateway,
20+
JwtService,
21+
],
1422
controllers: [IdeasCommentsController],
1523
exports: [IdeasCommentsService, IdeasCommentsRepository],
1624
})
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { JwtService } from '@nestjs/jwt';
2+
import { Server } from 'socket.io';
3+
import { Inject, UseFilters, forwardRef } from '@nestjs/common';
4+
import {
5+
WebSocketGateway,
6+
WebSocketServer,
7+
OnGatewayInit,
8+
OnGatewayConnection,
9+
OnGatewayDisconnect,
10+
SubscribeMessage,
11+
} from '@nestjs/websockets';
12+
13+
import { WSServiceErrorCatcher } from '@/common/decorators/ws.catch.decorator';
14+
import {
15+
MaterialSocket,
16+
MaterialAuthMiddleware,
17+
} from '@/common/middlewares/socket.ideasComment.middleware';
18+
import { IdeasCommentsRepository } from '@/base/ideasComments/ideasComments.repository';
19+
import { IdeaComment } from '@/base/ideasComments/interfaces/ideasComments.interface';
20+
21+
@UseFilters(WSServiceErrorCatcher)
22+
@WebSocketGateway({
23+
transports: ['websocket'],
24+
cors: {
25+
origin: '*', // to be defined later
26+
},
27+
namespace: 'ideasEquipements',
28+
})
29+
export class IdeasCommentGateway
30+
implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect
31+
{
32+
constructor(
33+
@Inject(forwardRef(() => IdeasCommentsRepository))
34+
private ideasCommentsRepository: IdeasCommentsRepository,
35+
private readonly jwtService: JwtService,
36+
) {}
37+
@WebSocketServer() server: Server;
38+
items = [];
39+
40+
afterInit(server: Server) {
41+
server.use(MaterialAuthMiddleware(this.jwtService));
42+
}
43+
44+
async handleConnection(client: MaterialSocket) {
45+
client.join(client.roomId);
46+
client.to(client.roomId).emit('peer-connected', client.id);
47+
}
48+
49+
async handleDisconnect(client: MaterialSocket) {
50+
client.to(client.roomId).emit('peer-disconnected', client.id);
51+
}
52+
53+
@SubscribeMessage('add-comment')
54+
async addComment(client: MaterialSocket, data: IdeaComment) {
55+
56+
this.items.unshift(data);
57+
58+
client.to(client.roomId).emit('comment-added', this.items[0]);
59+
}
60+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { JwtPayload } from '@/auth/interfaces/jwt.interface';
2+
import { Socket } from 'socket.io';
3+
import { JwtService } from '@nestjs/jwt';
4+
import { ObjectId } from 'mongodb';
5+
6+
import { parseCookieString } from '@/common/helpers/string.helper';
7+
import { config } from '@/config/config';
8+
import { Logger as NestLogger } from '@nestjs/common';
9+
import { WSServiceError } from '@/common/decorators/ws.catch.decorator';
10+
11+
export interface MaterialSocket extends Socket {
12+
user: JwtPayload;
13+
roomId: string;
14+
}
15+
16+
export type MaterialMiddleware = (socket: Socket, next: (err?: Error) => void) => void;
17+
18+
export const MaterialAuthMiddleware = (jwtService: JwtService): MaterialMiddleware => {
19+
return (socket: MaterialSocket, next) => {
20+
try {
21+
const materialCookies = socket.handshake.headers.cookie || '';
22+
const tokenMaterialCookie = parseCookieString(materialCookies);
23+
if (Object.keys(tokenMaterialCookie).length === 0)
24+
throw new Error('Could not find any cookies in the ws headers');
25+
const parsedTokenCookie = JSON.parse(tokenMaterialCookie['token']);
26+
const materialToken = parsedTokenCookie['token'];
27+
if (!materialToken) throw new Error('Token is undefined');
28+
29+
const materialPayload = <JwtPayload>(
30+
jwtService.verify(materialToken, { secret: config.jwt.secret })
31+
);
32+
if (!materialPayload?.id || !(materialPayload?.role >= 0 && materialPayload?.role <= 3))
33+
throw new Error('The jwt content is invalid');
34+
materialPayload.id = new ObjectId(materialPayload.id);
35+
36+
const roomId = socket.handshake.auth.roomId;
37+
38+
socket.roomId = roomId;
39+
socket.user = materialPayload;
40+
next();
41+
} catch (err) {
42+
if (err instanceof Error) {
43+
NestLogger.error(err.message);
44+
}
45+
46+
next(
47+
new WSServiceError('UNAUTHORIZED', 'You do not have the rights to access this resource'),
48+
);
49+
}
50+
};
51+
};

front-end/package-lock.json

Lines changed: 69 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

front-end/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
},
1414
"dependencies": {
1515
"@imengyu/vue3-context-menu": "^1.2.10",
16+
"@picmo/popup-picker": "^5.8.4",
1617
"@pixi/graphics-smooth": "^1.1.0",
1718
"@toycode/markdown-it-class": "^1.2.4",
1819
"@vitejs/plugin-vue-jsx": "^3.0.1",
@@ -32,6 +33,7 @@
3233
"marked": "^5.0.5",
3334
"mavon-editor": "^3.0.1",
3435
"pdfmake": "^0.2.7",
36+
"picmo": "^5.8.4",
3537
"pinia": "^2.1.3",
3638
"pixi-viewport": "^5.0.1",
3739
"pixi.js": "^7.2.4",
@@ -50,6 +52,7 @@
5052
"vue-qrcode-reader": "^3.1.6",
5153
"vue-qrious": "^3.1.0",
5254
"vue-router": "^4.2.2",
55+
"vue3-emoji-picker": "^1.1.7",
5356
"vuedraggable": "^4.1.0",
5457
"vuejs3-datepicker": "^1.0.19"
5558
},
@@ -74,7 +77,7 @@
7477
"tailwindcss": "^3.3.2",
7578
"typescript": "^5.0.4",
7679
"vite": "^4.3.9",
77-
"vue-eslint-parser": "^9.3.0",
80+
"vue-eslint-parser": "^9.3.1",
7881
"vue-tsc": "^1.6.5"
7982
}
8083
}

0 commit comments

Comments
 (0)