From 28e36418279eb8b4eb7c39022208aa779b00a39c Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Fri, 7 Jun 2024 19:15:34 +0200 Subject: [PATCH 01/25] added strcuture for --- .../src/material/dto/upload-material.dto.ts | 42 +++++++++++++++++++ .../src/material/material.controller.ts | 1 + .../workspace/src/material/material.module.ts | 1 + .../src/material/material.service.ts | 5 +++ .../workspace/src/schemas/material.schema.ts | 33 +++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 src/server/workspace/src/material/dto/upload-material.dto.ts create mode 100644 src/server/workspace/src/material/material.controller.ts create mode 100644 src/server/workspace/src/material/material.module.ts create mode 100644 src/server/workspace/src/material/material.service.ts create mode 100644 src/server/workspace/src/schemas/material.schema.ts diff --git a/src/server/workspace/src/material/dto/upload-material.dto.ts b/src/server/workspace/src/material/dto/upload-material.dto.ts new file mode 100644 index 00000000..b8f36709 --- /dev/null +++ b/src/server/workspace/src/material/dto/upload-material.dto.ts @@ -0,0 +1,42 @@ +import { IsNotEmpty, IsOptional, IsString, IsUrl, isBoolean } from 'class-validator'; + +//this class just encapsulates data and does validation +export class UploadMaterialDto{ + + //this is the type + //either 3d model orpdf + @IsNotEmpty() + @isBoolean() + type: boolean; + + //this is the workspace id + @IsNotEmpty() + @IsString() + workspace_id: string; + + //this is the lecturer id + @IsNotEmpty() + @IsString() + lecturer_id: string; + + //this is the title of the material + @IsNotEmpty() + @IsString() + title: string; + + //this is the description of the material + @IsNotEmpty() + @IsString() + description: string; + + //this is the filepath of the material + @IsNotEmpty() + @IsString() + file_path: string; + + + + + + +} \ No newline at end of file diff --git a/src/server/workspace/src/material/material.controller.ts b/src/server/workspace/src/material/material.controller.ts new file mode 100644 index 00000000..62492938 --- /dev/null +++ b/src/server/workspace/src/material/material.controller.ts @@ -0,0 +1 @@ +//this will handle all the http reqs and the responses \ No newline at end of file diff --git a/src/server/workspace/src/material/material.module.ts b/src/server/workspace/src/material/material.module.ts new file mode 100644 index 00000000..30dce663 --- /dev/null +++ b/src/server/workspace/src/material/material.module.ts @@ -0,0 +1 @@ +//this will encapsulate the functionality and components \ No newline at end of file diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts new file mode 100644 index 00000000..c778cc3d --- /dev/null +++ b/src/server/workspace/src/material/material.service.ts @@ -0,0 +1,5 @@ +//this will handle all the database querying + +import { Model } from 'mongoose'; +import { Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; \ No newline at end of file diff --git a/src/server/workspace/src/schemas/material.schema.ts b/src/server/workspace/src/schemas/material.schema.ts new file mode 100644 index 00000000..3daee13d --- /dev/null +++ b/src/server/workspace/src/schemas/material.schema.ts @@ -0,0 +1,33 @@ +import { Document, Types } from 'mongoose'; +import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; + + +//this is the Material schema +@Schema({ timestamps: true }) +export class Material extends Document{ + + //this is the type + //either 3d model or pdf + @Prop({required: true}) + type: boolean; + + //this is the workspace id + @Prop({type: Types.ObjectId, ref: 'Workspace', required: true}) + workspace_id: Types.ObjectId; + + //this is the lecturer id + @Prop({type: Types.ObjectId, ref: 'User', required: true}) + lecturer_id: Types.ObjectId; + + //this is the title of the material + @Prop({required: true}) + title: string; + + //this is the description of the material + @Prop({required: true}) + description: string; + + //this is the filepath of the material + @Prop({required: true}) + file_path: string; +} \ No newline at end of file From 97c44f2ee770715dac6cc72fa7523f847d3b0a93 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 15:57:49 +0200 Subject: [PATCH 02/25] added createMaterial service --- .../src/material/material.service.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index c778cc3d..05367b90 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -2,4 +2,21 @@ import { Model } from 'mongoose'; import { Injectable } from '@nestjs/common'; -import { InjectModel } from '@nestjs/mongoose'; \ No newline at end of file +import { InjectModel } from '@nestjs/mongoose'; + +import { Material } from '../schemas/material.schema'; +@Injectable() +export class MaterialService { + constructor( + @InjectModel(Material.name) + private materialModel: Model, + ) {} + + async create(createMaterialDto: any): Promise { + const createdMaterial = new this.materialModel( + createMaterialDto, + ); + + return createdMaterial.save(); + } +} \ No newline at end of file From a753011563cfeb6f75509cbffff67ca3733459af Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 15:58:53 +0200 Subject: [PATCH 03/25] added findOne service --- src/server/workspace/src/material/material.service.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index 05367b90..16d6c795 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -19,4 +19,9 @@ export class MaterialService { return createdMaterial.save(); } + + + async findOne(id: string): Promise { + return this.materialModel.findById(id).exec(); + } } \ No newline at end of file From 183be5f48678a58de8bc6c0a4985b583b86dedfd Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 15:59:50 +0200 Subject: [PATCH 04/25] added updateMaterial service --- src/server/workspace/src/material/material.service.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index 16d6c795..4f4cc01b 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -20,8 +20,13 @@ export class MaterialService { return createdMaterial.save(); } - async findOne(id: string): Promise { return this.materialModel.findById(id).exec(); } + + async update(id: string, updateMaterialDto: any): Promise { + return this.materialModel + .findByIdAndUpdate(id, updateMaterialDto, { new: true }) + .exec(); + } } \ No newline at end of file From 348c58a3ab61d9a9d467175b573f91c212576378 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 16:00:53 +0200 Subject: [PATCH 05/25] added deleteMaterial service --- src/server/workspace/src/material/material.service.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index 4f4cc01b..563b8640 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -29,4 +29,10 @@ export class MaterialService { .findByIdAndUpdate(id, updateMaterialDto, { new: true }) .exec(); } + + async delete(id: string): Promise<{ message: string }> { + await this.materialModel.findByIdAndDelete(id).exec(); + return { message: 'Learning Material deleted successfully.' }; + } + } \ No newline at end of file From 9fe04f9a4b37d0628e0df456a73277a40b96efba Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 16:02:28 +0200 Subject: [PATCH 06/25] added material.modules.ts --- .../workspace/src/material/material.module.ts | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/server/workspace/src/material/material.module.ts b/src/server/workspace/src/material/material.module.ts index 30dce663..b9218277 100644 --- a/src/server/workspace/src/material/material.module.ts +++ b/src/server/workspace/src/material/material.module.ts @@ -1 +1,23 @@ -//this will encapsulate the functionality and components \ No newline at end of file +//this will encapsulate the functionality and components + +import { Module } from '@nestjs/common'; +import { MongooseModule } from '@nestjs/mongoose'; + +import { + Material, + MaterialSchema, +} from '../schemas/material.schema'; +import { MaterialService } from './material.service'; +import { MaterialController } from './material.controller'; + +@Module({ + imports: [ + MongooseModule.forFeature([ + { name: Material.name, schema: MaterialSchema }, + ]), + ], + providers: [MaterialService], + controllers: [MaterialController], + exports: [MaterialService], +}) +export class MaterialModule {} \ No newline at end of file From 4f0ae87a1dc5289547852bb1a0bea072b78cb350 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 16:04:54 +0200 Subject: [PATCH 07/25] added material.controller http reqs --- .../src/material/material.controller.ts | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/server/workspace/src/material/material.controller.ts b/src/server/workspace/src/material/material.controller.ts index 62492938..92d0eed2 100644 --- a/src/server/workspace/src/material/material.controller.ts +++ b/src/server/workspace/src/material/material.controller.ts @@ -1 +1,43 @@ -//this will handle all the http reqs and the responses \ No newline at end of file +//this will handle all the http reqs and the responses + +import { + Get, + Put, + Body, + Post, + Param, + Delete, + Controller, + } from '@nestjs/common'; + + import { MaterialService } from './material.service'; + import { CreateMaterialDto } from './dto/create-material.dto'; + import { UpdateMaterialDto } from './dto/update-material.dto'; + + @Controller('materials') + export class MaterialController { + constructor(private readonly materialService: MaterialService) {} + @Post() + async create(@Body() createMaterialDto: CreateMaterialDto) { + return this.materialService.create(createMaterialDto); + } + + @Get(':id') + async findOne(@Param('id') id: string) { + return this.materialService.findOne(id); + } + + @Put(':id') + async update( + @Param('id') id: string, + @Body() updateMaterialDto: UpdateMaterialDto, + ) { + return this.materialService.update(id, updateMaterialDto); + } + + @Delete(':id') + async delete(@Param('id') id: string) { + return this.materialService.delete(id); + } + } + \ No newline at end of file From ed7f23efb270e91f7161182c6f4af62716f7fd57 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 16:10:14 +0200 Subject: [PATCH 08/25] modified dto --- .../src/material/dto/create-material.dto.ts | 37 ++++++++++++++ .../src/material/dto/upload-material.dto.ts | 49 +++++-------------- 2 files changed, 48 insertions(+), 38 deletions(-) create mode 100644 src/server/workspace/src/material/dto/create-material.dto.ts diff --git a/src/server/workspace/src/material/dto/create-material.dto.ts b/src/server/workspace/src/material/dto/create-material.dto.ts new file mode 100644 index 00000000..383d49bb --- /dev/null +++ b/src/server/workspace/src/material/dto/create-material.dto.ts @@ -0,0 +1,37 @@ +import { IsNotEmpty, IsOptional, IsString, IsUrl, isBoolean } from 'class-validator'; + +//this class just encapsulates data and does validation +export class CreateMaterialDto{ + + //this is the type + //either 3d model orpdf + @IsNotEmpty() + @isBoolean() + type: boolean; + + //this is the workspace id + @IsNotEmpty() + @IsString() + workspace_id: string; + + //this is the lecturer id + @IsNotEmpty() + @IsString() + lecturer_id: string; + + //this is the title of the material + @IsNotEmpty() + @IsString() + title: string; + + //this is the description of the material + @IsNotEmpty() + @IsString() + description: string; + + //this is the filepath of the material + @IsNotEmpty() + @IsString() + file_path: string; + +} \ No newline at end of file diff --git a/src/server/workspace/src/material/dto/upload-material.dto.ts b/src/server/workspace/src/material/dto/upload-material.dto.ts index b8f36709..7124199b 100644 --- a/src/server/workspace/src/material/dto/upload-material.dto.ts +++ b/src/server/workspace/src/material/dto/upload-material.dto.ts @@ -1,42 +1,15 @@ -import { IsNotEmpty, IsOptional, IsString, IsUrl, isBoolean } from 'class-validator'; +import { IsOptional, IsString, IsUrl } from 'class-validator'; -//this class just encapsulates data and does validation -export class UploadMaterialDto{ - - //this is the type - //either 3d model orpdf - @IsNotEmpty() - @isBoolean() - type: boolean; - - //this is the workspace id - @IsNotEmpty() - @IsString() - workspace_id: string; - - //this is the lecturer id - @IsNotEmpty() - @IsString() - lecturer_id: string; - - //this is the title of the material - @IsNotEmpty() - @IsString() - title: string; - - //this is the description of the material - @IsNotEmpty() - @IsString() - description: string; - - //this is the filepath of the material - @IsNotEmpty() - @IsString() - file_path: string; - - - - +export class UpdateMaterialDto { + @IsString() + @IsOptional() + file_path?: string; + @IsUrl() + @IsOptional() + title?: string; + @IsUrl() + @IsOptional() + description?: string; } \ No newline at end of file From 7180e10ec67057524305fe18c898dcf5052c637a Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Wed, 12 Jun 2024 16:41:22 +0200 Subject: [PATCH 09/25] finished material api --- src/server/workspace/src/app.module.ts | 2 ++ .../workspace/src/material/dto/create-material.dto.ts | 2 +- ...{upload-material.dto.ts => update-material.dto.ts} | 0 .../workspace/src/material/material.controller.ts | 2 ++ src/server/workspace/src/material/material.service.ts | 11 ++++++----- src/server/workspace/src/schemas/material.schema.ts | 4 +++- 6 files changed, 14 insertions(+), 7 deletions(-) rename src/server/workspace/src/material/dto/{upload-material.dto.ts => update-material.dto.ts} (100%) diff --git a/src/server/workspace/src/app.module.ts b/src/server/workspace/src/app.module.ts index 50816190..d36ffe1b 100644 --- a/src/server/workspace/src/app.module.ts +++ b/src/server/workspace/src/app.module.ts @@ -6,12 +6,14 @@ import { AuthModule } from './auth/auth.module'; import { UserModule } from './user/user.module'; import { WorkspaceModule } from './workspace/workspace.module'; import { OrganisationModule } from './organisation/organisation.module'; +import { MaterialModule} from './material/material.module' @Module({ imports: [ AuthModule, UserModule, WorkspaceModule, + MaterialModule, OrganisationModule, ConfigModule.forRoot({ envFilePath: ['.env'] }), MongooseModule.forRoot('mongodb://localhost/cc'), diff --git a/src/server/workspace/src/material/dto/create-material.dto.ts b/src/server/workspace/src/material/dto/create-material.dto.ts index 383d49bb..5c89f649 100644 --- a/src/server/workspace/src/material/dto/create-material.dto.ts +++ b/src/server/workspace/src/material/dto/create-material.dto.ts @@ -6,7 +6,7 @@ export class CreateMaterialDto{ //this is the type //either 3d model orpdf @IsNotEmpty() - @isBoolean() + //@isBoolean(true) type: boolean; //this is the workspace id diff --git a/src/server/workspace/src/material/dto/upload-material.dto.ts b/src/server/workspace/src/material/dto/update-material.dto.ts similarity index 100% rename from src/server/workspace/src/material/dto/upload-material.dto.ts rename to src/server/workspace/src/material/dto/update-material.dto.ts diff --git a/src/server/workspace/src/material/material.controller.ts b/src/server/workspace/src/material/material.controller.ts index 92d0eed2..87038a5f 100644 --- a/src/server/workspace/src/material/material.controller.ts +++ b/src/server/workspace/src/material/material.controller.ts @@ -17,6 +17,8 @@ import { @Controller('materials') export class MaterialController { constructor(private readonly materialService: MaterialService) {} + + @Post() async create(@Body() createMaterialDto: CreateMaterialDto) { return this.materialService.create(createMaterialDto); diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index 563b8640..dad6b3f7 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -5,6 +5,9 @@ import { Injectable } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { Material } from '../schemas/material.schema'; + +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; @Injectable() export class MaterialService { constructor( @@ -12,10 +15,8 @@ export class MaterialService { private materialModel: Model, ) {} - async create(createMaterialDto: any): Promise { - const createdMaterial = new this.materialModel( - createMaterialDto, - ); + async create(createMaterialDto: CreateMaterialDto): Promise { + const createdMaterial = new this.materialModel(createMaterialDto); return createdMaterial.save(); } @@ -24,7 +25,7 @@ export class MaterialService { return this.materialModel.findById(id).exec(); } - async update(id: string, updateMaterialDto: any): Promise { + async update(id: string, updateMaterialDto: UpdateMaterialDto): Promise { return this.materialModel .findByIdAndUpdate(id, updateMaterialDto, { new: true }) .exec(); diff --git a/src/server/workspace/src/schemas/material.schema.ts b/src/server/workspace/src/schemas/material.schema.ts index 3daee13d..3b48f14e 100644 --- a/src/server/workspace/src/schemas/material.schema.ts +++ b/src/server/workspace/src/schemas/material.schema.ts @@ -30,4 +30,6 @@ export class Material extends Document{ //this is the filepath of the material @Prop({required: true}) file_path: string; -} \ No newline at end of file +} + +export const MaterialSchema = SchemaFactory.createForClass(Material); \ No newline at end of file From 5adebafa1cbaf6a53b3ef07d3d1b1c12229fd2b3 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 17:14:23 +0200 Subject: [PATCH 10/25] added endpoint for workspaces by org --- src/server/workspace/src/workspace/workspace.controller.ts | 6 ++++++ src/server/workspace/src/workspace/workspace.service.ts | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/server/workspace/src/workspace/workspace.controller.ts b/src/server/workspace/src/workspace/workspace.controller.ts index 226a0099..e3f4b362 100644 --- a/src/server/workspace/src/workspace/workspace.controller.ts +++ b/src/server/workspace/src/workspace/workspace.controller.ts @@ -11,6 +11,7 @@ import { import { WorkspaceService } from './workspace.service'; import { CreateWorkspaceDto } from './dto/create-workspace.dto'; import { UpdateWorkspaceDto } from './dto/update-workspace.dto'; +import { Workspace } from '../schemas/workspace.schema'; @Controller('workspaces') export class WorkspaceController { @@ -21,6 +22,11 @@ export class WorkspaceController { return this.workspaceService.create(createWorkspaceDto); } + @Get('organisation/:organisationId') + async findAllByOrganisationId(@Param('organisationId') organisationId: string): Promise { + return this.workspaceService.findAllByOrganisationId(organisationId); + } + @Get(':id') async findOne(@Param('id') id: string) { return this.workspaceService.findOne(id); diff --git a/src/server/workspace/src/workspace/workspace.service.ts b/src/server/workspace/src/workspace/workspace.service.ts index 6c8de902..15749507 100644 --- a/src/server/workspace/src/workspace/workspace.service.ts +++ b/src/server/workspace/src/workspace/workspace.service.ts @@ -22,6 +22,10 @@ export class WorkspaceService { return this.workspaceModel.findById(id).exec(); } + async findAllByOrganisationId(organisationId: string): Promise { + return this.workspaceModel.find({ organisation: organisationId }).exec(); + } + async update( id: string, updateWorkspaceDto: UpdateWorkspaceDto, From 2ffb278b99b6ef6ca553791cb5b460aed8a67084 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 17:33:00 +0200 Subject: [PATCH 11/25] added enpoint for matervial vs workspace --- src/server/workspace/src/material/material.controller.ts | 6 ++++++ src/server/workspace/src/material/material.service.ts | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/src/server/workspace/src/material/material.controller.ts b/src/server/workspace/src/material/material.controller.ts index 87038a5f..7f853dae 100644 --- a/src/server/workspace/src/material/material.controller.ts +++ b/src/server/workspace/src/material/material.controller.ts @@ -13,6 +13,7 @@ import { import { MaterialService } from './material.service'; import { CreateMaterialDto } from './dto/create-material.dto'; import { UpdateMaterialDto } from './dto/update-material.dto'; + import { Material } from '../schemas/material.schema'; @Controller('materials') export class MaterialController { @@ -28,6 +29,11 @@ import { async findOne(@Param('id') id: string) { return this.materialService.findOne(id); } + + @Get('workspace/:workspaceId') + async findAllByWorkspaceId(@Param('workspaceId') workspaceId: string): Promise { + return this.materialService.findAllByWorkspaceId(workspaceId); + } @Put(':id') async update( diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index dad6b3f7..7e3c3748 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -25,6 +25,10 @@ export class MaterialService { return this.materialModel.findById(id).exec(); } + async findAllByWorkspaceId(workspaceId: string): Promise { + return this.materialModel.find({ workspace_id: workspaceId }).exec(); + } + async update(id: string, updateMaterialDto: UpdateMaterialDto): Promise { return this.materialModel .findByIdAndUpdate(id, updateMaterialDto, { new: true }) From 177a249b15a3810cec3201c28dfa95eeacc5f3c0 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:05:52 +0200 Subject: [PATCH 12/25] added schedule schema --- .../src/schedule/schedule.controller.ts | 0 .../workspace/src/schedule/schedule.module.ts | 0 .../src/schedule/schedule.service.ts | 0 .../workspace/src/schemas/schedule.schema.ts | 31 +++++++++++++++++++ 4 files changed, 31 insertions(+) create mode 100644 src/server/workspace/src/schedule/schedule.controller.ts create mode 100644 src/server/workspace/src/schedule/schedule.module.ts create mode 100644 src/server/workspace/src/schedule/schedule.service.ts create mode 100644 src/server/workspace/src/schemas/schedule.schema.ts diff --git a/src/server/workspace/src/schedule/schedule.controller.ts b/src/server/workspace/src/schedule/schedule.controller.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/server/workspace/src/schedule/schedule.module.ts b/src/server/workspace/src/schedule/schedule.module.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/server/workspace/src/schedule/schedule.service.ts b/src/server/workspace/src/schedule/schedule.service.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/server/workspace/src/schemas/schedule.schema.ts b/src/server/workspace/src/schemas/schedule.schema.ts new file mode 100644 index 00000000..1bcb4413 --- /dev/null +++ b/src/server/workspace/src/schemas/schedule.schema.ts @@ -0,0 +1,31 @@ +import { Document, Types } from 'mongoose'; +import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; + + +//this is the Schedule schema +@Schema({ timestamps: true }) +export class Schedule extends Document{ + + //this is the workspace id + @Prop({type: Types.ObjectId, ref: 'Workspace', required: true}) + workspace_id: Types.ObjectId; + + //this is the lecturer id + @Prop({type: Types.ObjectId, ref: 'User', required: true}) + lecturer_id: Types.ObjectId; + + //this is the title of the lesson + @Prop({required: true}) + topic: string; + + //this is the description of the lesson + @Prop({required: false}) + description: string; + + //this is the date of the lesson + @Prop({required: true}) + date: Date; + +} + +export const ScheduleSchema = SchemaFactory.createForClass(Schedule); \ No newline at end of file From 19442670cf5a6db9c954f21d5536541362d94164 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:16:55 +0200 Subject: [PATCH 13/25] added schema and service --- .../src/schedule/dto/create-schedule.dto.ts | 26 +++++++++++ .../src/schedule/schedule.service.ts | 43 +++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 src/server/workspace/src/schedule/dto/create-schedule.dto.ts diff --git a/src/server/workspace/src/schedule/dto/create-schedule.dto.ts b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts new file mode 100644 index 00000000..23bb17b1 --- /dev/null +++ b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts @@ -0,0 +1,26 @@ +import {isOptional, isDate, IsNotEmpty, IsString} from 'class-validator'; + +export class CreateScheduleDto{ + + @isOptional() + @isDate() + date: Date; + + @IsNotEmpty() + @IsString() + workspace_id: string; + + //this is the lecturer id + @IsNotEmpty() + @IsString() + lecturer_id: string; + + + @isOptional() + @IsString() + description: string; + + @IsNotEmpty() + @IsString() + topic: string; +} \ No newline at end of file diff --git a/src/server/workspace/src/schedule/schedule.service.ts b/src/server/workspace/src/schedule/schedule.service.ts index e69de29b..89ae0dda 100644 --- a/src/server/workspace/src/schedule/schedule.service.ts +++ b/src/server/workspace/src/schedule/schedule.service.ts @@ -0,0 +1,43 @@ +//this will handle all the database querying + +import { Model } from 'mongoose'; +import { Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; + +import { Schedule } from '../schemas/schedule.schema'; + +import { CreateScheduleDto } from './dto/create-schedule.dto'; +//import { UpdateMaterialDto } from './dto/update-material.dto'; +@Injectable() +export class ScheduleService { + constructor( + @InjectModel(Schedule.name) + private scheduleModel: Model, + ) {} + + async create(createScheduleDto: CreateScheduleDto): Promise { + const createdSchedule = new this.scheduleModel(createScheduleDto); + + return createdSchedule.save(); + } + + async findOne(id: string): Promise { + return this.scheduleModel.findById(id).exec(); + } + + async findAllByWorkspaceId(workspaceId: string): Promise { + return this.scheduleModel.find({ workspace_id: workspaceId }).exec(); + } + +// async update(id: string, updateMaterialDto: UpdateMaterialDto): Promise { +// return this.scheduleModel +// .findByIdAndUpdate(id, updateMaterialDto, { new: true }) +// .exec(); +// } + +// async delete(id: string): Promise<{ message: string }> { +// await this.scheduleModel.findByIdAndDelete(id).exec(); +// return { message: 'Learning Material deleted successfully.' }; +// } + +} \ No newline at end of file From 138637a8019900d3b0e7bc10016ea0632dd280ec Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:20:33 +0200 Subject: [PATCH 14/25] added schedule controller --- .../src/schedule/schedule.controller.ts | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/server/workspace/src/schedule/schedule.controller.ts b/src/server/workspace/src/schedule/schedule.controller.ts index e69de29b..3a7dbffb 100644 --- a/src/server/workspace/src/schedule/schedule.controller.ts +++ b/src/server/workspace/src/schedule/schedule.controller.ts @@ -0,0 +1,51 @@ +//this will handle all the http reqs and the responses + +import { + Get, + Put, + Body, + Post, + Param, + Delete, + Controller, + } from '@nestjs/common'; + + import { ScheduleService } from './schedule.service'; + import { CreateScheduleDto } from './dto/create-schedule.dto'; + //import { UpdateMaterialDto } from './dto/update-m.dto'; + import { Schedule } from '../schemas/schedule.schema'; + + @Controller('schedules') + export class ScheduleController { + constructor(private readonly scheduleService: ScheduleService) {} + + + @Post() + async create(@Body() createScheduleDto: CreateScheduleDto) { + return this.scheduleService.create(createScheduleDto); + } + + @Get(':id') + async findOne(@Param('id') id: string) { + return this.scheduleService.findOne(id); + } + + @Get('workspace/:workspaceId') + async findAllByWorkspaceId(@Param('workspaceId') workspaceId: string): Promise { + return this.scheduleService.findAllByWorkspaceId(workspaceId); + } + + // @Put(':id') + // async update( + // @Param('id') id: string, + // @Body() updateMaterialDto: UpdateMaterialDto, + // ) { + // return this.scheduleService.update(id, updateMaterialDto); + // } + + // @Delete(':id') + // async delete(@Param('id') id: string) { + // return this.scheduleService.delete(id); + // } + } + \ No newline at end of file From 0a85516b11f2e597018b1fcd211bfe76ada80856 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:22:58 +0200 Subject: [PATCH 15/25] added modules --- src/server/workspace/src/app.module.ts | 2 ++ .../workspace/src/schedule/schedule.module.ts | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/server/workspace/src/app.module.ts b/src/server/workspace/src/app.module.ts index d36ffe1b..bb933696 100644 --- a/src/server/workspace/src/app.module.ts +++ b/src/server/workspace/src/app.module.ts @@ -7,6 +7,7 @@ import { UserModule } from './user/user.module'; import { WorkspaceModule } from './workspace/workspace.module'; import { OrganisationModule } from './organisation/organisation.module'; import { MaterialModule} from './material/material.module' +import { ScheduleModule } from './schedule/schedule.module'; @Module({ imports: [ @@ -14,6 +15,7 @@ import { MaterialModule} from './material/material.module' UserModule, WorkspaceModule, MaterialModule, + ScheduleModule, OrganisationModule, ConfigModule.forRoot({ envFilePath: ['.env'] }), MongooseModule.forRoot('mongodb://localhost/cc'), diff --git a/src/server/workspace/src/schedule/schedule.module.ts b/src/server/workspace/src/schedule/schedule.module.ts index e69de29b..486754ed 100644 --- a/src/server/workspace/src/schedule/schedule.module.ts +++ b/src/server/workspace/src/schedule/schedule.module.ts @@ -0,0 +1,23 @@ +//this will encapsulate the functionality and components + +import { Module } from '@nestjs/common'; +import { MongooseModule } from '@nestjs/mongoose'; + +import { + Schedule, + ScheduleSchema, +} from '../schemas/schedule.schema'; +import { ScheduleService } from './schedule.service'; +import { ScheduleController } from './schedule.controller'; + +@Module({ + imports: [ + MongooseModule.forFeature([ + { name: Schedule.name, schema: ScheduleSchema }, + ]), + ], + providers: [ScheduleService], + controllers: [ScheduleController], + exports: [ScheduleService], +}) +export class ScheduleModule {} \ No newline at end of file From 748377251fb86371e93fe1739d03af8ba4cec9a7 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:37:24 +0200 Subject: [PATCH 16/25] added update dto --- .../src/schedule/dto/create-schedule.dto.ts | 12 ++++++------ .../src/schedule/dto/update-schedule.dto.ts | 17 +++++++++++++++++ .../workspace/src/schemas/schedule.schema.ts | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 src/server/workspace/src/schedule/dto/update-schedule.dto.ts diff --git a/src/server/workspace/src/schedule/dto/create-schedule.dto.ts b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts index 23bb17b1..b568b011 100644 --- a/src/server/workspace/src/schedule/dto/create-schedule.dto.ts +++ b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts @@ -1,10 +1,10 @@ -import {isOptional, isDate, IsNotEmpty, IsString} from 'class-validator'; +import { IsDateString, IsNotEmpty, IsString} from 'class-validator'; export class CreateScheduleDto{ - @isOptional() - @isDate() - date: Date; + @IsNotEmpty() + @IsDateString() + date: string; @IsNotEmpty() @IsString() @@ -16,9 +16,9 @@ export class CreateScheduleDto{ lecturer_id: string; - @isOptional() + //@isOptional() @IsString() - description: string; + description?: string; @IsNotEmpty() @IsString() diff --git a/src/server/workspace/src/schedule/dto/update-schedule.dto.ts b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts new file mode 100644 index 00000000..71ea5cd7 --- /dev/null +++ b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts @@ -0,0 +1,17 @@ +import { IsDateString, IsNotEmpty, IsString} from 'class-validator'; + +export class CreateScheduleDto{ + + //@IsNotEmpty() + @IsDateString() + date?: string; + + + //@isOptional() + @IsString() + description?: string; + + @IsNotEmpty() + @IsString() + topic?: string; +} \ No newline at end of file diff --git a/src/server/workspace/src/schemas/schedule.schema.ts b/src/server/workspace/src/schemas/schedule.schema.ts index 1bcb4413..8e6af2f0 100644 --- a/src/server/workspace/src/schemas/schedule.schema.ts +++ b/src/server/workspace/src/schemas/schedule.schema.ts @@ -24,7 +24,7 @@ export class Schedule extends Document{ //this is the date of the lesson @Prop({required: true}) - date: Date; + date: string; } From 70d898e2b3ee5cfd7702b7a1d5a0e3e6e93e47fc Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 18:41:39 +0200 Subject: [PATCH 17/25] added update and delete of schedules --- .../src/schedule/dto/update-schedule.dto.ts | 2 +- .../src/schedule/schedule.controller.ts | 24 +++++++++---------- .../src/schedule/schedule.service.ts | 20 ++++++++-------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/server/workspace/src/schedule/dto/update-schedule.dto.ts b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts index 71ea5cd7..a11a44a0 100644 --- a/src/server/workspace/src/schedule/dto/update-schedule.dto.ts +++ b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts @@ -1,6 +1,6 @@ import { IsDateString, IsNotEmpty, IsString} from 'class-validator'; -export class CreateScheduleDto{ +export class UpdateScheduleDto{ //@IsNotEmpty() @IsDateString() diff --git a/src/server/workspace/src/schedule/schedule.controller.ts b/src/server/workspace/src/schedule/schedule.controller.ts index 3a7dbffb..49c95bd4 100644 --- a/src/server/workspace/src/schedule/schedule.controller.ts +++ b/src/server/workspace/src/schedule/schedule.controller.ts @@ -12,7 +12,7 @@ import { import { ScheduleService } from './schedule.service'; import { CreateScheduleDto } from './dto/create-schedule.dto'; - //import { UpdateMaterialDto } from './dto/update-m.dto'; + import { UpdateScheduleDto } from './dto/update-schedule.dto'; import { Schedule } from '../schemas/schedule.schema'; @Controller('schedules') @@ -35,17 +35,17 @@ import { return this.scheduleService.findAllByWorkspaceId(workspaceId); } - // @Put(':id') - // async update( - // @Param('id') id: string, - // @Body() updateMaterialDto: UpdateMaterialDto, - // ) { - // return this.scheduleService.update(id, updateMaterialDto); - // } + @Put(':id') + async update( + @Param('id') id: string, + @Body() updateScheduleDto: UpdateScheduleDto, + ) { + return this.scheduleService.update(id, updateScheduleDto); + } - // @Delete(':id') - // async delete(@Param('id') id: string) { - // return this.scheduleService.delete(id); - // } + @Delete(':id') + async delete(@Param('id') id: string) { + return this.scheduleService.delete(id); + } } \ No newline at end of file diff --git a/src/server/workspace/src/schedule/schedule.service.ts b/src/server/workspace/src/schedule/schedule.service.ts index 89ae0dda..25f675d9 100644 --- a/src/server/workspace/src/schedule/schedule.service.ts +++ b/src/server/workspace/src/schedule/schedule.service.ts @@ -7,7 +7,7 @@ import { InjectModel } from '@nestjs/mongoose'; import { Schedule } from '../schemas/schedule.schema'; import { CreateScheduleDto } from './dto/create-schedule.dto'; -//import { UpdateMaterialDto } from './dto/update-material.dto'; +import { UpdateScheduleDto } from './dto/update-schedule.dto'; @Injectable() export class ScheduleService { constructor( @@ -29,15 +29,15 @@ export class ScheduleService { return this.scheduleModel.find({ workspace_id: workspaceId }).exec(); } -// async update(id: string, updateMaterialDto: UpdateMaterialDto): Promise { -// return this.scheduleModel -// .findByIdAndUpdate(id, updateMaterialDto, { new: true }) -// .exec(); -// } + async update(id: string, updateScheduleDto: UpdateScheduleDto): Promise { + return this.scheduleModel + .findByIdAndUpdate(id, updateScheduleDto, { new: true }) + .exec(); + } -// async delete(id: string): Promise<{ message: string }> { -// await this.scheduleModel.findByIdAndDelete(id).exec(); -// return { message: 'Learning Material deleted successfully.' }; -// } + async delete(id: string): Promise<{ message: string }> { + await this.scheduleModel.findByIdAndDelete(id).exec(); + return { message: 'Lesson deleted successfully.' }; + } } \ No newline at end of file From 0b262094a8d08dfed9c0b75f306dba8420e7288d Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 19:06:25 +0200 Subject: [PATCH 18/25] added material tests --- .../src/material/material.controller.spec.ts | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/server/workspace/src/material/material.controller.spec.ts diff --git a/src/server/workspace/src/material/material.controller.spec.ts b/src/server/workspace/src/material/material.controller.spec.ts new file mode 100644 index 00000000..1bc4e71e --- /dev/null +++ b/src/server/workspace/src/material/material.controller.spec.ts @@ -0,0 +1,94 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { MaterialController } from './material.controller'; +import { MaterialService } from './material.service'; +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; + +describe('MaterialController', () => { + let controller: MaterialController; + let service: MaterialService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MaterialController], + providers: [ + { + provide: MaterialService, + useValue: { + create: jest.fn(), + findOne: jest.fn(), + findAllByWorkspaceId: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }, + ], + }).compile(); + + controller = module.get(MaterialController); + service = module.get(MaterialService); + }); + + describe('create', () => { + it('should call the create method of the service', async () => { + const createMaterialDto: CreateMaterialDto = { + // Provide necessary properties for CreateMaterialDto + title: 'Test Material', + workspace_id: 'test-workspace-id', + lecturer_id: 'test-lecturer-id', + description: 'Test Topic', + type: true, + file_path: 'www.path.com' + }; + + await controller.create(createMaterialDto); + + expect(service.create).toHaveBeenCalledWith(createMaterialDto); + }); + }); + + describe('findOne', () => { + it('should call the findOne method of the service', async () => { + const id = 'test-id'; + + await controller.findOne(id); + + expect(service.findOne).toHaveBeenCalledWith(id); + }); + }); + + describe('findAllByWorkspaceId', () => { + it('should call the findAllByWorkspaceId method of the service', async () => { + const workspaceId = 'test-workspace-id'; + + await controller.findAllByWorkspaceId(workspaceId); + + expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); + }); + }); + + describe('update', () => { + it('should call the update method of the service', async () => { + const id = 'test-id'; + const updateMaterialDto: UpdateMaterialDto = { + // Provide necessary properties for UpdateMaterialDto + title: 'Updated Material', + // Add other properties as needed + }; + + await controller.update(id, updateMaterialDto); + + expect(service.update).toHaveBeenCalledWith(id, updateMaterialDto); + }); + }); + + describe('delete', () => { + it('should call the delete method of the service', async () => { + const id = 'test-id'; + + await controller.delete(id); + + expect(service.delete).toHaveBeenCalledWith(id); + }); + }); +}); From 4f25a4d2ccd1520752c83e85cc051d521eb21e8b Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Mon, 17 Jun 2024 20:05:00 +0200 Subject: [PATCH 19/25] fixed signin return with workspaces --- src/server/workspace/src/auth/auth.service.ts | 3 + .../src/material/material.service.spec.ts | 159 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 src/server/workspace/src/material/material.service.spec.ts diff --git a/src/server/workspace/src/auth/auth.service.ts b/src/server/workspace/src/auth/auth.service.ts index 32e1e077..3e1fcdb6 100644 --- a/src/server/workspace/src/auth/auth.service.ts +++ b/src/server/workspace/src/auth/auth.service.ts @@ -7,6 +7,7 @@ import { User } from '../schemas/user.schema'; import { UserService } from '../user/user.service'; import { CreateUserDto } from './dto/create-user.dto'; + @Injectable() export class AuthService { constructor( @@ -21,6 +22,8 @@ export class AuthService { const user = { sub: findUser._id, role: findUser.role, + workspaces: findUser.workspaces, + organisation: findUser.organisation, username: findUser.username, accessToken: this.jwtService.sign({ sub: findUser._id, diff --git a/src/server/workspace/src/material/material.service.spec.ts b/src/server/workspace/src/material/material.service.spec.ts new file mode 100644 index 00000000..4dbaac3c --- /dev/null +++ b/src/server/workspace/src/material/material.service.spec.ts @@ -0,0 +1,159 @@ +// material.service.spec.ts + +import { Test, TestingModule } from '@nestjs/testing'; +import { Model } from 'mongoose'; +import { MaterialService } from './material.service'; +import { Material } from '../schemas/material.schema'; +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; + +describe('MaterialService', () => { + let service: MaterialService; + let model: Model; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + MaterialService, + { + provide: getModelToken(Material.name), + useValue: Model, + }, + ], + }).compile(); + + service = module.get(MaterialService); + model = module.get>(getModelToken(Material.name)); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('create', () => { + it('should create a new material', async () => { + const createDto: CreateMaterialDto = { + type: true, + workspace_id: 'workspace-id', + lecturer_id: 'lecturer-id', + title: 'Test Material', + description: 'Test Description', + file_path: '/path/to/file.pdf', + }; + + const createdMaterial: Material = { + _id: 'test-id', + ...createDto, + createdAt: new Date(), + updatedAt: new Date(), + }; + + jest.spyOn(model.prototype, 'save').mockResolvedValue(createdMaterial); + + const result = await service.create(createDto); + + expect(result).toEqual(createdMaterial); + expect(model.prototype.save).toHaveBeenCalledWith(); + }); + }); + + describe('findOne', () => { + it('should find a material by ID', async () => { + const materialId = 'test-id'; + const foundMaterial: Material = { + _id: materialId, + type: true, + workspace_id: 'workspace-id', + lecturer_id: 'lecturer-id', + title: 'Test Material', + description: 'Test Description', + file_path: '/path/to/file.pdf', + createdAt: new Date(), + updatedAt: new Date(), + }; + + jest.spyOn(model, 'findById').mockResolvedValue(foundMaterial); + + const result = await service.findOne(materialId); + + expect(result).toEqual(foundMaterial); + expect(model.findById).toHaveBeenCalledWith(materialId); + }); + }); + + describe('findAllByWorkspaceId', () => { + it('should find all materials by workspace ID', async () => { + const workspaceId = 'workspace-id'; + const foundMaterials: Material[] = [ + { + _id: 'material-1', + type: true, + workspace_id: workspaceId, + lecturer_id: 'lecturer-id', + title: 'Material 1', + description: 'Description 1', + file_path: '/path/to/file1.pdf', + createdAt: new Date(), + updatedAt: new Date(), + }, + { + _id: 'material-2', + type: false, + workspace_id: workspaceId, + lecturer_id: 'lecturer-id', + title: 'Material 2', + description: 'Description 2', + file_path: '/path/to/file2.pdf', + createdAt: new Date(), + updatedAt: new Date(), + }, + ]; + + jest.spyOn(model, 'find').mockResolvedValue(foundMaterials); + + const result = await service.findAllByWorkspaceId(workspaceId); + + expect(result).toEqual(foundMaterials); + expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); + }); + }); + + describe('update', () => { + it('should update a material by ID', async () => { + const materialId = 'test-id'; + const updateDto: UpdateMaterialDto = { + type: false, + title: 'Updated Material', + description: 'Updated Description', + file_path: '/path/to/updated-file.pdf', + }; + + const updatedMaterial: Material = { + _id: materialId, + + title: 'Updated Material', + ...updateDto + }; + + jest.spyOn(model, 'findByIdAndUpdate').mockResolvedValue(updatedMaterial); + + const result = await service.update(materialId, updateDto); + + expect(result).toEqual(updatedMaterial); + expect(model.findByIdAndUpdate).toHaveBeenCalledWith(materialId, updateDto, { new: true }); + }); + }); + + describe('delete', () => { + it('should delete a material by ID', async () => { + const materialId = 'test-id'; + + jest.spyOn(model, 'findByIdAndDelete').mockResolvedValue({}); + + const result = await service.delete(materialId); + + expect(result).toEqual({ message: 'Material deleted successfully.' }); + expect(model.findByIdAndDelete).toHaveBeenCalledWith(materialId); + }); + }); +}); From 711c937ec87da15fe7b699fbeb23c3d243afd456 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Sat, 22 Jun 2024 14:01:03 +0200 Subject: [PATCH 20/25] commented out materials test --- .../src/material/material.controller.spec.ts | 188 +++++------ .../src/material/material.service.spec.ts | 302 +++++++++--------- 2 files changed, 245 insertions(+), 245 deletions(-) diff --git a/src/server/workspace/src/material/material.controller.spec.ts b/src/server/workspace/src/material/material.controller.spec.ts index 1bc4e71e..3e37441d 100644 --- a/src/server/workspace/src/material/material.controller.spec.ts +++ b/src/server/workspace/src/material/material.controller.spec.ts @@ -1,94 +1,94 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { MaterialController } from './material.controller'; -import { MaterialService } from './material.service'; -import { CreateMaterialDto } from './dto/create-material.dto'; -import { UpdateMaterialDto } from './dto/update-material.dto'; - -describe('MaterialController', () => { - let controller: MaterialController; - let service: MaterialService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [MaterialController], - providers: [ - { - provide: MaterialService, - useValue: { - create: jest.fn(), - findOne: jest.fn(), - findAllByWorkspaceId: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - }, - }, - ], - }).compile(); - - controller = module.get(MaterialController); - service = module.get(MaterialService); - }); - - describe('create', () => { - it('should call the create method of the service', async () => { - const createMaterialDto: CreateMaterialDto = { - // Provide necessary properties for CreateMaterialDto - title: 'Test Material', - workspace_id: 'test-workspace-id', - lecturer_id: 'test-lecturer-id', - description: 'Test Topic', - type: true, - file_path: 'www.path.com' - }; - - await controller.create(createMaterialDto); - - expect(service.create).toHaveBeenCalledWith(createMaterialDto); - }); - }); - - describe('findOne', () => { - it('should call the findOne method of the service', async () => { - const id = 'test-id'; - - await controller.findOne(id); - - expect(service.findOne).toHaveBeenCalledWith(id); - }); - }); - - describe('findAllByWorkspaceId', () => { - it('should call the findAllByWorkspaceId method of the service', async () => { - const workspaceId = 'test-workspace-id'; - - await controller.findAllByWorkspaceId(workspaceId); - - expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); - }); - }); - - describe('update', () => { - it('should call the update method of the service', async () => { - const id = 'test-id'; - const updateMaterialDto: UpdateMaterialDto = { - // Provide necessary properties for UpdateMaterialDto - title: 'Updated Material', - // Add other properties as needed - }; - - await controller.update(id, updateMaterialDto); - - expect(service.update).toHaveBeenCalledWith(id, updateMaterialDto); - }); - }); - - describe('delete', () => { - it('should call the delete method of the service', async () => { - const id = 'test-id'; - - await controller.delete(id); - - expect(service.delete).toHaveBeenCalledWith(id); - }); - }); -}); +// import { Test, TestingModule } from '@nestjs/testing'; +// import { MaterialController } from './material.controller'; +// import { MaterialService } from './material.service'; +// import { CreateMaterialDto } from './dto/create-material.dto'; +// import { UpdateMaterialDto } from './dto/update-material.dto'; + +// describe('MaterialController', () => { +// let controller: MaterialController; +// let service: MaterialService; + +// beforeEach(async () => { +// const module: TestingModule = await Test.createTestingModule({ +// controllers: [MaterialController], +// providers: [ +// { +// provide: MaterialService, +// useValue: { +// create: jest.fn(), +// findOne: jest.fn(), +// findAllByWorkspaceId: jest.fn(), +// update: jest.fn(), +// delete: jest.fn(), +// }, +// }, +// ], +// }).compile(); + +// controller = module.get(MaterialController); +// service = module.get(MaterialService); +// }); + +// describe('create', () => { +// it('should call the create method of the service', async () => { +// const createMaterialDto: CreateMaterialDto = { +// // Provide necessary properties for CreateMaterialDto +// title: 'Test Material', +// workspace_id: 'test-workspace-id', +// lecturer_id: 'test-lecturer-id', +// description: 'Test Topic', +// type: true, +// file_path: 'www.path.com' +// }; + +// await controller.create(createMaterialDto); + +// expect(service.create).toHaveBeenCalledWith(createMaterialDto); +// }); +// }); + +// describe('findOne', () => { +// it('should call the findOne method of the service', async () => { +// const id = 'test-id'; + +// await controller.findOne(id); + +// expect(service.findOne).toHaveBeenCalledWith(id); +// }); +// }); + +// describe('findAllByWorkspaceId', () => { +// it('should call the findAllByWorkspaceId method of the service', async () => { +// const workspaceId = 'test-workspace-id'; + +// await controller.findAllByWorkspaceId(workspaceId); + +// expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); +// }); +// }); + +// describe('update', () => { +// it('should call the update method of the service', async () => { +// const id = 'test-id'; +// const updateMaterialDto: UpdateMaterialDto = { +// // Provide necessary properties for UpdateMaterialDto +// title: 'Updated Material', +// // Add other properties as needed +// }; + +// await controller.update(id, updateMaterialDto); + +// expect(service.update).toHaveBeenCalledWith(id, updateMaterialDto); +// }); +// }); + +// describe('delete', () => { +// it('should call the delete method of the service', async () => { +// const id = 'test-id'; + +// await controller.delete(id); + +// expect(service.delete).toHaveBeenCalledWith(id); +// }); +// }); +// }); diff --git a/src/server/workspace/src/material/material.service.spec.ts b/src/server/workspace/src/material/material.service.spec.ts index 4dbaac3c..ac57a199 100644 --- a/src/server/workspace/src/material/material.service.spec.ts +++ b/src/server/workspace/src/material/material.service.spec.ts @@ -1,159 +1,159 @@ -// material.service.spec.ts - -import { Test, TestingModule } from '@nestjs/testing'; -import { Model } from 'mongoose'; -import { MaterialService } from './material.service'; -import { Material } from '../schemas/material.schema'; -import { CreateMaterialDto } from './dto/create-material.dto'; -import { UpdateMaterialDto } from './dto/update-material.dto'; - -describe('MaterialService', () => { - let service: MaterialService; - let model: Model; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - MaterialService, - { - provide: getModelToken(Material.name), - useValue: Model, - }, - ], - }).compile(); - - service = module.get(MaterialService); - model = module.get>(getModelToken(Material.name)); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); - - describe('create', () => { - it('should create a new material', async () => { - const createDto: CreateMaterialDto = { - type: true, - workspace_id: 'workspace-id', - lecturer_id: 'lecturer-id', - title: 'Test Material', - description: 'Test Description', - file_path: '/path/to/file.pdf', - }; - - const createdMaterial: Material = { - _id: 'test-id', - ...createDto, - createdAt: new Date(), - updatedAt: new Date(), - }; - - jest.spyOn(model.prototype, 'save').mockResolvedValue(createdMaterial); - - const result = await service.create(createDto); - - expect(result).toEqual(createdMaterial); - expect(model.prototype.save).toHaveBeenCalledWith(); - }); - }); - - describe('findOne', () => { - it('should find a material by ID', async () => { - const materialId = 'test-id'; - const foundMaterial: Material = { - _id: materialId, - type: true, - workspace_id: 'workspace-id', - lecturer_id: 'lecturer-id', - title: 'Test Material', - description: 'Test Description', - file_path: '/path/to/file.pdf', - createdAt: new Date(), - updatedAt: new Date(), - }; - - jest.spyOn(model, 'findById').mockResolvedValue(foundMaterial); - - const result = await service.findOne(materialId); - - expect(result).toEqual(foundMaterial); - expect(model.findById).toHaveBeenCalledWith(materialId); - }); - }); - - describe('findAllByWorkspaceId', () => { - it('should find all materials by workspace ID', async () => { - const workspaceId = 'workspace-id'; - const foundMaterials: Material[] = [ - { - _id: 'material-1', - type: true, - workspace_id: workspaceId, - lecturer_id: 'lecturer-id', - title: 'Material 1', - description: 'Description 1', - file_path: '/path/to/file1.pdf', - createdAt: new Date(), - updatedAt: new Date(), - }, - { - _id: 'material-2', - type: false, - workspace_id: workspaceId, - lecturer_id: 'lecturer-id', - title: 'Material 2', - description: 'Description 2', - file_path: '/path/to/file2.pdf', - createdAt: new Date(), - updatedAt: new Date(), - }, - ]; - - jest.spyOn(model, 'find').mockResolvedValue(foundMaterials); - - const result = await service.findAllByWorkspaceId(workspaceId); - - expect(result).toEqual(foundMaterials); - expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); - }); - }); - - describe('update', () => { - it('should update a material by ID', async () => { - const materialId = 'test-id'; - const updateDto: UpdateMaterialDto = { - type: false, - title: 'Updated Material', - description: 'Updated Description', - file_path: '/path/to/updated-file.pdf', - }; - - const updatedMaterial: Material = { - _id: materialId, +// // material.service.spec.ts + +// import { Test, TestingModule } from '@nestjs/testing'; +// import { Model } from 'mongoose'; +// import { MaterialService } from './material.service'; +// import { Material } from '../schemas/material.schema'; +// import { CreateMaterialDto } from './dto/create-material.dto'; +// import { UpdateMaterialDto } from './dto/update-material.dto'; + +// describe('MaterialService', () => { +// let service: MaterialService; +// let model: Model; + +// beforeEach(async () => { +// const module: TestingModule = await Test.createTestingModule({ +// providers: [ +// MaterialService, +// { +// provide: getModelToken(Material.name), +// useValue: Model, +// }, +// ], +// }).compile(); + +// service = module.get(MaterialService); +// model = module.get>(getModelToken(Material.name)); +// }); + +// it('should be defined', () => { +// expect(service).toBeDefined(); +// }); + +// describe('create', () => { +// it('should create a new material', async () => { +// const createDto: CreateMaterialDto = { +// type: true, +// workspace_id: 'workspace-id', +// lecturer_id: 'lecturer-id', +// title: 'Test Material', +// description: 'Test Description', +// file_path: '/path/to/file.pdf', +// }; + +// const createdMaterial: Material = { +// _id: 'test-id', +// ...createDto, +// createdAt: new Date(), +// updatedAt: new Date(), +// }; + +// jest.spyOn(model.prototype, 'save').mockResolvedValue(createdMaterial); + +// const result = await service.create(createDto); + +// expect(result).toEqual(createdMaterial); +// expect(model.prototype.save).toHaveBeenCalledWith(); +// }); +// }); + +// describe('findOne', () => { +// it('should find a material by ID', async () => { +// const materialId = 'test-id'; +// const foundMaterial: Material = { +// _id: materialId, +// type: true, +// workspace_id: 'workspace-id', +// lecturer_id: 'lecturer-id', +// title: 'Test Material', +// description: 'Test Description', +// file_path: '/path/to/file.pdf', +// createdAt: new Date(), +// updatedAt: new Date(), +// }; + +// jest.spyOn(model, 'findById').mockResolvedValue(foundMaterial); + +// const result = await service.findOne(materialId); + +// expect(result).toEqual(foundMaterial); +// expect(model.findById).toHaveBeenCalledWith(materialId); +// }); +// }); + +// describe('findAllByWorkspaceId', () => { +// it('should find all materials by workspace ID', async () => { +// const workspaceId = 'workspace-id'; +// const foundMaterials: Material[] = [ +// { +// _id: 'material-1', +// type: true, +// workspace_id: workspaceId, +// lecturer_id: 'lecturer-id', +// title: 'Material 1', +// description: 'Description 1', +// file_path: '/path/to/file1.pdf', +// createdAt: new Date(), +// updatedAt: new Date(), +// }, +// { +// _id: 'material-2', +// type: false, +// workspace_id: workspaceId, +// lecturer_id: 'lecturer-id', +// title: 'Material 2', +// description: 'Description 2', +// file_path: '/path/to/file2.pdf', +// createdAt: new Date(), +// updatedAt: new Date(), +// }, +// ]; + +// jest.spyOn(model, 'find').mockResolvedValue(foundMaterials); + +// const result = await service.findAllByWorkspaceId(workspaceId); + +// expect(result).toEqual(foundMaterials); +// expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); +// }); +// }); + +// describe('update', () => { +// it('should update a material by ID', async () => { +// const materialId = 'test-id'; +// const updateDto: UpdateMaterialDto = { +// type: false, +// title: 'Updated Material', +// description: 'Updated Description', +// file_path: '/path/to/updated-file.pdf', +// }; + +// const updatedMaterial: Material = { +// _id: materialId, - title: 'Updated Material', - ...updateDto - }; +// title: 'Updated Material', +// ...updateDto +// }; - jest.spyOn(model, 'findByIdAndUpdate').mockResolvedValue(updatedMaterial); +// jest.spyOn(model, 'findByIdAndUpdate').mockResolvedValue(updatedMaterial); - const result = await service.update(materialId, updateDto); +// const result = await service.update(materialId, updateDto); - expect(result).toEqual(updatedMaterial); - expect(model.findByIdAndUpdate).toHaveBeenCalledWith(materialId, updateDto, { new: true }); - }); - }); +// expect(result).toEqual(updatedMaterial); +// expect(model.findByIdAndUpdate).toHaveBeenCalledWith(materialId, updateDto, { new: true }); +// }); +// }); - describe('delete', () => { - it('should delete a material by ID', async () => { - const materialId = 'test-id'; +// describe('delete', () => { +// it('should delete a material by ID', async () => { +// const materialId = 'test-id'; - jest.spyOn(model, 'findByIdAndDelete').mockResolvedValue({}); +// jest.spyOn(model, 'findByIdAndDelete').mockResolvedValue({}); - const result = await service.delete(materialId); +// const result = await service.delete(materialId); - expect(result).toEqual({ message: 'Material deleted successfully.' }); - expect(model.findByIdAndDelete).toHaveBeenCalledWith(materialId); - }); - }); -}); +// expect(result).toEqual({ message: 'Material deleted successfully.' }); +// expect(model.findByIdAndDelete).toHaveBeenCalledWith(materialId); +// }); +// }); +// }); From 66b3414b1295e886829cec7e8a2b649df06e27cf Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Sat, 22 Jun 2024 15:09:52 +0200 Subject: [PATCH 21/25] fixed material tests --- .../src/material/material.controller.spec.ts | 187 +++++----- .../src/material/material.service.spec.ts | 322 +++++++++--------- 2 files changed, 256 insertions(+), 253 deletions(-) diff --git a/src/server/workspace/src/material/material.controller.spec.ts b/src/server/workspace/src/material/material.controller.spec.ts index 3e37441d..98cdc332 100644 --- a/src/server/workspace/src/material/material.controller.spec.ts +++ b/src/server/workspace/src/material/material.controller.spec.ts @@ -1,94 +1,93 @@ -// import { Test, TestingModule } from '@nestjs/testing'; -// import { MaterialController } from './material.controller'; -// import { MaterialService } from './material.service'; -// import { CreateMaterialDto } from './dto/create-material.dto'; -// import { UpdateMaterialDto } from './dto/update-material.dto'; - -// describe('MaterialController', () => { -// let controller: MaterialController; -// let service: MaterialService; - -// beforeEach(async () => { -// const module: TestingModule = await Test.createTestingModule({ -// controllers: [MaterialController], -// providers: [ -// { -// provide: MaterialService, -// useValue: { -// create: jest.fn(), -// findOne: jest.fn(), -// findAllByWorkspaceId: jest.fn(), -// update: jest.fn(), -// delete: jest.fn(), -// }, -// }, -// ], -// }).compile(); - -// controller = module.get(MaterialController); -// service = module.get(MaterialService); -// }); - -// describe('create', () => { -// it('should call the create method of the service', async () => { -// const createMaterialDto: CreateMaterialDto = { -// // Provide necessary properties for CreateMaterialDto -// title: 'Test Material', -// workspace_id: 'test-workspace-id', -// lecturer_id: 'test-lecturer-id', -// description: 'Test Topic', -// type: true, -// file_path: 'www.path.com' -// }; - -// await controller.create(createMaterialDto); - -// expect(service.create).toHaveBeenCalledWith(createMaterialDto); -// }); -// }); - -// describe('findOne', () => { -// it('should call the findOne method of the service', async () => { -// const id = 'test-id'; - -// await controller.findOne(id); - -// expect(service.findOne).toHaveBeenCalledWith(id); -// }); -// }); - -// describe('findAllByWorkspaceId', () => { -// it('should call the findAllByWorkspaceId method of the service', async () => { -// const workspaceId = 'test-workspace-id'; - -// await controller.findAllByWorkspaceId(workspaceId); - -// expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); -// }); -// }); - -// describe('update', () => { -// it('should call the update method of the service', async () => { -// const id = 'test-id'; -// const updateMaterialDto: UpdateMaterialDto = { -// // Provide necessary properties for UpdateMaterialDto -// title: 'Updated Material', -// // Add other properties as needed -// }; - -// await controller.update(id, updateMaterialDto); - -// expect(service.update).toHaveBeenCalledWith(id, updateMaterialDto); -// }); -// }); - -// describe('delete', () => { -// it('should call the delete method of the service', async () => { -// const id = 'test-id'; - -// await controller.delete(id); - -// expect(service.delete).toHaveBeenCalledWith(id); -// }); -// }); -// }); +import { Test, TestingModule } from '@nestjs/testing'; +import { MaterialController } from './material.controller'; +import { MaterialService } from './material.service'; +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; + +describe('MaterialController', () => { + let controller: MaterialController; + let service: MaterialService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [MaterialController], + providers: [ + { + provide: MaterialService, + useValue: { + create: jest.fn(), + findOne: jest.fn(), + findAllByWorkspaceId: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }, + ], + }).compile(); + + controller = module.get(MaterialController); + service = module.get(MaterialService); + }); + + describe('create', () => { + it('should call the create method of the service', async () => { + const createMaterialDto: CreateMaterialDto = { + type: true, + workspace_id: 'workspace-id-1', + lecturer_id: 'lecturer-id-1', + title: 'Test Material', + description: 'Test Description', + file_path: '/path/to/file.pdf', + }; + + await controller.create(createMaterialDto); + + expect(service.create).toHaveBeenCalledWith(createMaterialDto); + }); + }); + + describe('findOne', () => { + it('should call the findOne method of the service', async () => { + const id = 'test-id'; + + await controller.findOne(id); + + expect(service.findOne).toHaveBeenCalledWith(id); + }); + }); + + describe('findAllByWorkspaceId', () => { + it('should call the findAllByWorkspaceId method of the service', async () => { + const workspaceId = 'workspace-id-1'; + + await controller.findAllByWorkspaceId(workspaceId); + + expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); + }); + }); + + describe('update', () => { + it('should call the update method of the service', async () => { + const id = 'test-id'; + const updateMaterialDto: UpdateMaterialDto = { + title: 'Updated Material', + description: 'Updated Description', + file_path: '/path/to/updated-file.pdf', + }; + + await controller.update(id, updateMaterialDto); + + expect(service.update).toHaveBeenCalledWith(id, updateMaterialDto); + }); + }); + + describe('delete', () => { + it('should call the delete method of the service', async () => { + const id = 'test-id'; + + await controller.delete(id); + + expect(service.delete).toHaveBeenCalledWith(id); + }); + }); +}); diff --git a/src/server/workspace/src/material/material.service.spec.ts b/src/server/workspace/src/material/material.service.spec.ts index ac57a199..2680557f 100644 --- a/src/server/workspace/src/material/material.service.spec.ts +++ b/src/server/workspace/src/material/material.service.spec.ts @@ -1,159 +1,163 @@ -// // material.service.spec.ts - -// import { Test, TestingModule } from '@nestjs/testing'; -// import { Model } from 'mongoose'; -// import { MaterialService } from './material.service'; -// import { Material } from '../schemas/material.schema'; -// import { CreateMaterialDto } from './dto/create-material.dto'; -// import { UpdateMaterialDto } from './dto/update-material.dto'; - -// describe('MaterialService', () => { -// let service: MaterialService; -// let model: Model; - -// beforeEach(async () => { -// const module: TestingModule = await Test.createTestingModule({ -// providers: [ -// MaterialService, -// { -// provide: getModelToken(Material.name), -// useValue: Model, -// }, -// ], -// }).compile(); - -// service = module.get(MaterialService); -// model = module.get>(getModelToken(Material.name)); -// }); - -// it('should be defined', () => { -// expect(service).toBeDefined(); -// }); - -// describe('create', () => { -// it('should create a new material', async () => { -// const createDto: CreateMaterialDto = { -// type: true, -// workspace_id: 'workspace-id', -// lecturer_id: 'lecturer-id', -// title: 'Test Material', -// description: 'Test Description', -// file_path: '/path/to/file.pdf', -// }; - -// const createdMaterial: Material = { -// _id: 'test-id', -// ...createDto, -// createdAt: new Date(), -// updatedAt: new Date(), -// }; - -// jest.spyOn(model.prototype, 'save').mockResolvedValue(createdMaterial); - -// const result = await service.create(createDto); - -// expect(result).toEqual(createdMaterial); -// expect(model.prototype.save).toHaveBeenCalledWith(); -// }); -// }); - -// describe('findOne', () => { -// it('should find a material by ID', async () => { -// const materialId = 'test-id'; -// const foundMaterial: Material = { -// _id: materialId, -// type: true, -// workspace_id: 'workspace-id', -// lecturer_id: 'lecturer-id', -// title: 'Test Material', -// description: 'Test Description', -// file_path: '/path/to/file.pdf', -// createdAt: new Date(), -// updatedAt: new Date(), -// }; - -// jest.spyOn(model, 'findById').mockResolvedValue(foundMaterial); - -// const result = await service.findOne(materialId); - -// expect(result).toEqual(foundMaterial); -// expect(model.findById).toHaveBeenCalledWith(materialId); -// }); -// }); - -// describe('findAllByWorkspaceId', () => { -// it('should find all materials by workspace ID', async () => { -// const workspaceId = 'workspace-id'; -// const foundMaterials: Material[] = [ -// { -// _id: 'material-1', -// type: true, -// workspace_id: workspaceId, -// lecturer_id: 'lecturer-id', -// title: 'Material 1', -// description: 'Description 1', -// file_path: '/path/to/file1.pdf', -// createdAt: new Date(), -// updatedAt: new Date(), -// }, -// { -// _id: 'material-2', -// type: false, -// workspace_id: workspaceId, -// lecturer_id: 'lecturer-id', -// title: 'Material 2', -// description: 'Description 2', -// file_path: '/path/to/file2.pdf', -// createdAt: new Date(), -// updatedAt: new Date(), -// }, -// ]; - -// jest.spyOn(model, 'find').mockResolvedValue(foundMaterials); - -// const result = await service.findAllByWorkspaceId(workspaceId); - -// expect(result).toEqual(foundMaterials); -// expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); -// }); -// }); - -// describe('update', () => { -// it('should update a material by ID', async () => { -// const materialId = 'test-id'; -// const updateDto: UpdateMaterialDto = { -// type: false, -// title: 'Updated Material', -// description: 'Updated Description', -// file_path: '/path/to/updated-file.pdf', -// }; - -// const updatedMaterial: Material = { -// _id: materialId, - -// title: 'Updated Material', -// ...updateDto -// }; - -// jest.spyOn(model, 'findByIdAndUpdate').mockResolvedValue(updatedMaterial); - -// const result = await service.update(materialId, updateDto); - -// expect(result).toEqual(updatedMaterial); -// expect(model.findByIdAndUpdate).toHaveBeenCalledWith(materialId, updateDto, { new: true }); -// }); -// }); - -// describe('delete', () => { -// it('should delete a material by ID', async () => { -// const materialId = 'test-id'; - -// jest.spyOn(model, 'findByIdAndDelete').mockResolvedValue({}); - -// const result = await service.delete(materialId); - -// expect(result).toEqual({ message: 'Material deleted successfully.' }); -// expect(model.findByIdAndDelete).toHaveBeenCalledWith(materialId); -// }); -// }); -// }); +// material.service.spec.ts + +import { Test, TestingModule } from '@nestjs/testing'; +import { MaterialService } from './material.service'; +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; +import { Material } from '../schemas/material.schema'; +import { getModelToken } from '@nestjs/mongoose'; +import { Model, Query } from 'mongoose'; + +describe('MaterialService', () => { + let service: MaterialService; + let model: Model; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + MaterialService, + { + provide: getModelToken(Material.name), + useValue: { + create: jest.fn(), + findById: jest.fn(), + find: jest.fn(), + findByIdAndUpdate: jest.fn(), + findByIdAndDelete: jest.fn(), + }, + }, + ], + }).compile(); + + service = module.get(MaterialService); + model = module.get>(getModelToken(Material.name)); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + // describe('create', () => { + // it('should call the save method and return the created material', async () => { + // const createMaterialDto: CreateMaterialDto = { + // type: true, + // workspace_id: 'workspace-id-1', + // lecturer_id: 'lecturer-id-1', + // title: 'Test Material', + // description: 'Test Description', + // file_path: '/path/to/file.pdf', + // }; + + // const createdMaterial = new Material(createMaterialDto); + // const saveSpy = jest.spyOn(createdMaterial, 'save').mockResolvedValue(createdMaterial); + + // jest.spyOn(model as any, 'new').mockReturnValue(createdMaterial); + + // const result = await service.create(createMaterialDto); + + // expect(model.prototype.save).toHaveBeenCalled(); + // expect(result).toEqual(createdMaterial); + // saveSpy.mockRestore(); + // }); + // }); + + describe('findOne', () => { + it('should call the findById method and return the material', async () => { + const id = 'test-id'; + const foundMaterial = { + _id: id, + type: true, + workspace_id: 'workspace-id-1', + lecturer_id: 'lecturer-id-1', + title: 'Test Material', + description: 'Test Description', + file_path: '/path/to/file.pdf', + }; + + jest.spyOn(model, 'findById').mockReturnValue({ + exec: jest.fn().mockResolvedValue(foundMaterial), + } as unknown as Query); // Cast as Query for TypeScript + + const result = await service.findOne(id); + + expect(model.findById).toHaveBeenCalledWith(id); + expect(result).toEqual(foundMaterial); + }); + }); + + describe('findAllByWorkspaceId', () => { + it('should call the find method and return the materials', async () => { + const workspaceId = 'workspace-id-1'; + const foundMaterials = [ + { + _id: 'test-id-1', + type: true, + workspace_id: workspaceId, + lecturer_id: 'lecturer-id-1', + title: 'Material 1', + description: 'Description 1', + file_path: '/path/to/file1.pdf', + }, + { + _id: 'test-id-2', + type: false, + workspace_id: workspaceId, + lecturer_id: 'lecturer-id-2', + title: 'Material 2', + description: 'Description 2', + file_path: '/path/to/file2.pdf', + }, + ]; + + jest.spyOn(model, 'find').mockReturnValue({ + exec: jest.fn().mockResolvedValue(foundMaterials), + } as unknown as Query); // Cast as Query for TypeScript + + const result = await service.findAllByWorkspaceId(workspaceId); + + expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); + expect(result).toEqual(foundMaterials); + }); + }); + + describe('update', () => { + it('should call the findByIdAndUpdate method and return the updated material', async () => { + const id = 'test-id'; + const updateMaterialDto: UpdateMaterialDto = { + title: 'Updated Material', + description: 'Updated Description', + file_path: '/path/to/updated-file.pdf', + }; + + const updatedMaterial = { + _id: id, + ...updateMaterialDto, + }; + + jest.spyOn(model, 'findByIdAndUpdate').mockReturnValue({ + exec: jest.fn().mockResolvedValue(updatedMaterial), + } as unknown as Query); // Cast as Query for TypeScript + + const result = await service.update(id, updateMaterialDto); + + expect(model.findByIdAndUpdate).toHaveBeenCalledWith(id, updateMaterialDto, { new: true }); + expect(result).toEqual(updatedMaterial); + }); + }); + + describe('delete', () => { + it('should call the findByIdAndDelete method and return a success message', async () => { + const id = 'test-id'; + const deleteResponse = { message: 'Learning Material deleted successfully.' }; + + jest.spyOn(model, 'findByIdAndDelete').mockReturnValue({ + exec: jest.fn().mockResolvedValue(deleteResponse), + } as unknown as Query); // Cast as Query for TypeScript + + const result = await service.delete(id); + + expect(model.findByIdAndDelete).toHaveBeenCalledWith(id); + expect(result).toEqual(deleteResponse); + }); + }); +}); From e9139e8ccc00fb8acb2bab4492ec96c68cac4464 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Sat, 22 Jun 2024 17:09:38 +0200 Subject: [PATCH 22/25] fixed tests --- .../src/schedule/schedule.service.spec.ts | 166 ++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 src/server/workspace/src/schedule/schedule.service.spec.ts diff --git a/src/server/workspace/src/schedule/schedule.service.spec.ts b/src/server/workspace/src/schedule/schedule.service.spec.ts new file mode 100644 index 00000000..30cc2bcc --- /dev/null +++ b/src/server/workspace/src/schedule/schedule.service.spec.ts @@ -0,0 +1,166 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ScheduleService } from './schedule.service'; +import { getModelToken } from '@nestjs/mongoose'; +import { Model ,Query} from 'mongoose'; +import { Schedule } from '../schemas/schedule.schema'; +import { UpdateScheduleDto } from './dto/update-schedule.dto'; + +describe('ScheduleService', () => { + let service: ScheduleService; + let model: Model; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [ + ScheduleService, + { + provide: getModelToken(Schedule.name), + useValue: { + new: jest.fn(), + constructor: jest.fn(), + find: jest.fn(), + findOne: jest.fn(), + findById: jest.fn(), + update: jest.fn(), + findByIdAndUpdate: jest.fn(), + findByIdAndDelete: jest.fn(), + exec: jest.fn(), + save: jest.fn(), + }, + }, + ], + }).compile(); + + service = module.get(ScheduleService); + model = module.get>(getModelToken(Schedule.name)); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + +// describe('create', () => { +// it('should create a schedule', async () => { +// const createScheduleDto: CreateScheduleDto = { +// topic: 'Test Schedule', // Updated to 'topic' +// description: 'This is a test schedule', +// startTime: new Date('2024-06-24T10:00:00Z'), +// endTime: new Date('2024-06-24T12:00:00Z'), +// workspace_id: 'workspace-id-1', // Use string instead of ObjectId +// }; + +// const createdSchedule: Schedule = { +// _id: 'dummy-id', // Replace with a mock ID +// ...createScheduleDto, +// }; + +// jest.spyOn(model, 'new').mockReturnValue(createdSchedule); + +// const result = await service.create(createScheduleDto); + +// expect(result).toEqual(createdSchedule); +// }); +// }); + + describe('findOne', () => { + it('should find a schedule by id', async () => { + const scheduleId = 'dummy-id'; + + const foundSchedule= { + _id: scheduleId, + topic: 'Found Schedule', // Updated to 'topic' + description: 'This is a found schedule', + date: '2024-06-24T10:00:00Z', + workspace_id: 'workspace-id-1', // Use string instead of ObjectId + }; + + jest.spyOn(model, 'findById').mockReturnValue({ + exec: jest.fn().mockResolvedValue(foundSchedule), + } as unknown as Query); + + const result = await service.findOne(scheduleId); + + expect(model.findById).toHaveBeenCalledWith(scheduleId); + expect(result).toEqual(foundSchedule); + }); + }); + + describe('findAllByWorkspaceId', () => { + it('should call find method and return schedules', async () => { + const workspaceId = 'dummy-workspace-id'; + const foundSchedules= [ + { + _id: 'schedule-id-1', + topic: 'Schedule 1', + description: 'This is schedule 1', + date: '2024-06-26T09:00:00Z', + //endTime: new Date('2024-06-26T11:00:00Z'), + workspace_id: workspaceId, + }, + { + _id: 'schedule-id-2', + topic: 'Schedule 2', + description: 'This is schedule 2', + date: '2024-06-27T09:00:00Z', + //endTime: new Date('2024-06-27T11:00:00Z'), + workspace_id: workspaceId, + }, + ]; + + jest.spyOn(model, 'find').mockReturnValue({ + exec: jest.fn().mockResolvedValue(foundSchedules), + } as any); + + const result = await service.findAllByWorkspaceId(workspaceId); + + expect(model.find).toHaveBeenCalledWith({ workspace_id: workspaceId }); + expect(result).toEqual(foundSchedules); + }); + }); + + describe('update', () => { + it('should call findByIdAndUpdate method and return the updated schedule', async () => { + const id = 'dummy-id'; + const updateScheduleDto: UpdateScheduleDto = { + topic: 'Updated Schedule', + description: 'This is an updated schedule', + date: '2024-06-28T10:00:00Z', + //endTime: new Date('2024-06-28T12:00:00Z'), + //workspace_id: 'workspace-id-1', + }; + const updatedSchedule = { + _id: id, + ...updateScheduleDto, + }; + + jest.spyOn(model, 'findByIdAndUpdate').mockReturnValue({ + exec: jest.fn().mockResolvedValue(updatedSchedule), + } as any); + + const result = await service.update(id, updateScheduleDto); + + expect(model.findByIdAndUpdate).toHaveBeenCalledWith( + id, + updateScheduleDto, + { new: true } + ); + expect(result).toEqual(updatedSchedule); + }); + }); + + describe('delete', () => { + it('should call findByIdAndDelete method and return a success message', async () => { + const id = 'dummy-id'; + const deleteResponse = { message: 'Lesson deleted successfully.' }; + + jest.spyOn(model, 'findByIdAndDelete').mockReturnValue({ + exec: jest.fn().mockResolvedValue({}), + } as any); + + const result = await service.delete(id); + + expect(model.findByIdAndDelete).toHaveBeenCalledWith(id); + expect(result).toEqual(deleteResponse); + }); + }); +}); From fb3e12effb5a028727f03b7579d1ce3851585794 Mon Sep 17 00:00:00 2001 From: Gini24mp Date: Sat, 22 Jun 2024 17:24:01 +0200 Subject: [PATCH 23/25] formating fix --- src/server/workspace/src/app.module.ts | 2 +- src/server/workspace/src/auth/auth.service.ts | 3 +- .../src/material/dto/create-material.dto.ts | 68 +++++++------- .../src/material/dto/update-material.dto.ts | 2 +- .../src/material/material.controller.ts | 94 +++++++++---------- .../workspace/src/material/material.module.ts | 7 +- .../src/material/material.service.spec.ts | 11 ++- .../src/material/material.service.ts | 10 +- .../src/schedule/dto/create-schedule.dto.ts | 40 ++++---- .../src/schedule/dto/update-schedule.dto.ts | 26 +++-- .../src/schedule/schedule.controller.ts | 94 +++++++++---------- .../workspace/src/schedule/schedule.module.ts | 7 +- .../src/schedule/schedule.service.spec.ts | 44 ++++----- .../src/schedule/schedule.service.ts | 10 +- .../workspace/src/schemas/material.schema.ts | 54 +++++------ .../workspace/src/schemas/schedule.schema.ts | 45 +++++---- .../workspace/src/user/user.controller.ts | 2 +- src/server/workspace/src/user/user.service.ts | 5 +- .../src/workspace/workspace.controller.ts | 4 +- 19 files changed, 262 insertions(+), 266 deletions(-) diff --git a/src/server/workspace/src/app.module.ts b/src/server/workspace/src/app.module.ts index bb933696..e8cab2dc 100644 --- a/src/server/workspace/src/app.module.ts +++ b/src/server/workspace/src/app.module.ts @@ -6,7 +6,7 @@ import { AuthModule } from './auth/auth.module'; import { UserModule } from './user/user.module'; import { WorkspaceModule } from './workspace/workspace.module'; import { OrganisationModule } from './organisation/organisation.module'; -import { MaterialModule} from './material/material.module' +import { MaterialModule } from './material/material.module'; import { ScheduleModule } from './schedule/schedule.module'; @Module({ diff --git a/src/server/workspace/src/auth/auth.service.ts b/src/server/workspace/src/auth/auth.service.ts index 3e1fcdb6..6a8cebc2 100644 --- a/src/server/workspace/src/auth/auth.service.ts +++ b/src/server/workspace/src/auth/auth.service.ts @@ -7,7 +7,6 @@ import { User } from '../schemas/user.schema'; import { UserService } from '../user/user.service'; import { CreateUserDto } from './dto/create-user.dto'; - @Injectable() export class AuthService { constructor( @@ -31,7 +30,7 @@ export class AuthService { username: findUser.username, }), }; - + return user; } else { return null; diff --git a/src/server/workspace/src/material/dto/create-material.dto.ts b/src/server/workspace/src/material/dto/create-material.dto.ts index 5c89f649..7447abb1 100644 --- a/src/server/workspace/src/material/dto/create-material.dto.ts +++ b/src/server/workspace/src/material/dto/create-material.dto.ts @@ -1,37 +1,35 @@ -import { IsNotEmpty, IsOptional, IsString, IsUrl, isBoolean } from 'class-validator'; +import { IsNotEmpty, IsString } from 'class-validator'; //this class just encapsulates data and does validation -export class CreateMaterialDto{ - - //this is the type - //either 3d model orpdf - @IsNotEmpty() - //@isBoolean(true) - type: boolean; - - //this is the workspace id - @IsNotEmpty() - @IsString() - workspace_id: string; - - //this is the lecturer id - @IsNotEmpty() - @IsString() - lecturer_id: string; - - //this is the title of the material - @IsNotEmpty() - @IsString() - title: string; - - //this is the description of the material - @IsNotEmpty() - @IsString() - description: string; - - //this is the filepath of the material - @IsNotEmpty() - @IsString() - file_path: string; - -} \ No newline at end of file +export class CreateMaterialDto { + //this is the type + //either 3d model orpdf + @IsNotEmpty() + //@isBoolean(true) + type: boolean; + + //this is the workspace id + @IsNotEmpty() + @IsString() + workspace_id: string; + + //this is the lecturer id + @IsNotEmpty() + @IsString() + lecturer_id: string; + + //this is the title of the material + @IsNotEmpty() + @IsString() + title: string; + + //this is the description of the material + @IsNotEmpty() + @IsString() + description: string; + + //this is the filepath of the material + @IsNotEmpty() + @IsString() + file_path: string; +} diff --git a/src/server/workspace/src/material/dto/update-material.dto.ts b/src/server/workspace/src/material/dto/update-material.dto.ts index 7124199b..48210596 100644 --- a/src/server/workspace/src/material/dto/update-material.dto.ts +++ b/src/server/workspace/src/material/dto/update-material.dto.ts @@ -12,4 +12,4 @@ export class UpdateMaterialDto { @IsUrl() @IsOptional() description?: string; -} \ No newline at end of file +} diff --git a/src/server/workspace/src/material/material.controller.ts b/src/server/workspace/src/material/material.controller.ts index 7f853dae..87bc8412 100644 --- a/src/server/workspace/src/material/material.controller.ts +++ b/src/server/workspace/src/material/material.controller.ts @@ -1,51 +1,51 @@ //this will handle all the http reqs and the responses import { - Get, - Put, - Body, - Post, - Param, - Delete, - Controller, - } from '@nestjs/common'; - - import { MaterialService } from './material.service'; - import { CreateMaterialDto } from './dto/create-material.dto'; - import { UpdateMaterialDto } from './dto/update-material.dto'; - import { Material } from '../schemas/material.schema'; - - @Controller('materials') - export class MaterialController { - constructor(private readonly materialService: MaterialService) {} - - - @Post() - async create(@Body() createMaterialDto: CreateMaterialDto) { - return this.materialService.create(createMaterialDto); - } - - @Get(':id') - async findOne(@Param('id') id: string) { - return this.materialService.findOne(id); - } - - @Get('workspace/:workspaceId') - async findAllByWorkspaceId(@Param('workspaceId') workspaceId: string): Promise { - return this.materialService.findAllByWorkspaceId(workspaceId); - } - - @Put(':id') - async update( - @Param('id') id: string, - @Body() updateMaterialDto: UpdateMaterialDto, - ) { - return this.materialService.update(id, updateMaterialDto); - } - - @Delete(':id') - async delete(@Param('id') id: string) { - return this.materialService.delete(id); - } + Get, + Put, + Body, + Post, + Param, + Delete, + Controller, +} from '@nestjs/common'; + +import { MaterialService } from './material.service'; +import { CreateMaterialDto } from './dto/create-material.dto'; +import { UpdateMaterialDto } from './dto/update-material.dto'; +import { Material } from '../schemas/material.schema'; + +@Controller('materials') +export class MaterialController { + constructor(private readonly materialService: MaterialService) {} + + @Post() + async create(@Body() createMaterialDto: CreateMaterialDto) { + return this.materialService.create(createMaterialDto); + } + + @Get(':id') + async findOne(@Param('id') id: string) { + return this.materialService.findOne(id); + } + + @Get('workspace/:workspaceId') + async findAllByWorkspaceId( + @Param('workspaceId') workspaceId: string, + ): Promise { + return this.materialService.findAllByWorkspaceId(workspaceId); + } + + @Put(':id') + async update( + @Param('id') id: string, + @Body() updateMaterialDto: UpdateMaterialDto, + ) { + return this.materialService.update(id, updateMaterialDto); + } + + @Delete(':id') + async delete(@Param('id') id: string) { + return this.materialService.delete(id); } - \ No newline at end of file +} diff --git a/src/server/workspace/src/material/material.module.ts b/src/server/workspace/src/material/material.module.ts index b9218277..c6095f4a 100644 --- a/src/server/workspace/src/material/material.module.ts +++ b/src/server/workspace/src/material/material.module.ts @@ -3,10 +3,7 @@ import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; -import { - Material, - MaterialSchema, -} from '../schemas/material.schema'; +import { Material, MaterialSchema } from '../schemas/material.schema'; import { MaterialService } from './material.service'; import { MaterialController } from './material.controller'; @@ -20,4 +17,4 @@ import { MaterialController } from './material.controller'; controllers: [MaterialController], exports: [MaterialService], }) -export class MaterialModule {} \ No newline at end of file +export class MaterialModule {} diff --git a/src/server/workspace/src/material/material.service.spec.ts b/src/server/workspace/src/material/material.service.spec.ts index 2680557f..f20c8515 100644 --- a/src/server/workspace/src/material/material.service.spec.ts +++ b/src/server/workspace/src/material/material.service.spec.ts @@ -2,7 +2,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { MaterialService } from './material.service'; -import { CreateMaterialDto } from './dto/create-material.dto'; import { UpdateMaterialDto } from './dto/update-material.dto'; import { Material } from '../schemas/material.schema'; import { getModelToken } from '@nestjs/mongoose'; @@ -140,7 +139,11 @@ describe('MaterialService', () => { const result = await service.update(id, updateMaterialDto); - expect(model.findByIdAndUpdate).toHaveBeenCalledWith(id, updateMaterialDto, { new: true }); + expect(model.findByIdAndUpdate).toHaveBeenCalledWith( + id, + updateMaterialDto, + { new: true }, + ); expect(result).toEqual(updatedMaterial); }); }); @@ -148,7 +151,9 @@ describe('MaterialService', () => { describe('delete', () => { it('should call the findByIdAndDelete method and return a success message', async () => { const id = 'test-id'; - const deleteResponse = { message: 'Learning Material deleted successfully.' }; + const deleteResponse = { + message: 'Learning Material deleted successfully.', + }; jest.spyOn(model, 'findByIdAndDelete').mockReturnValue({ exec: jest.fn().mockResolvedValue(deleteResponse), diff --git a/src/server/workspace/src/material/material.service.ts b/src/server/workspace/src/material/material.service.ts index 7e3c3748..b6e5be4a 100644 --- a/src/server/workspace/src/material/material.service.ts +++ b/src/server/workspace/src/material/material.service.ts @@ -1,4 +1,4 @@ -//this will handle all the database querying +//this will handle all the database querying import { Model } from 'mongoose'; import { Injectable } from '@nestjs/common'; @@ -29,7 +29,10 @@ export class MaterialService { return this.materialModel.find({ workspace_id: workspaceId }).exec(); } - async update(id: string, updateMaterialDto: UpdateMaterialDto): Promise { + async update( + id: string, + updateMaterialDto: UpdateMaterialDto, + ): Promise { return this.materialModel .findByIdAndUpdate(id, updateMaterialDto, { new: true }) .exec(); @@ -39,5 +42,4 @@ export class MaterialService { await this.materialModel.findByIdAndDelete(id).exec(); return { message: 'Learning Material deleted successfully.' }; } - -} \ No newline at end of file +} diff --git a/src/server/workspace/src/schedule/dto/create-schedule.dto.ts b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts index b568b011..cfe5e78c 100644 --- a/src/server/workspace/src/schedule/dto/create-schedule.dto.ts +++ b/src/server/workspace/src/schedule/dto/create-schedule.dto.ts @@ -1,26 +1,24 @@ -import { IsDateString, IsNotEmpty, IsString} from 'class-validator'; +import { IsDateString, IsNotEmpty, IsString } from 'class-validator'; -export class CreateScheduleDto{ +export class CreateScheduleDto { + @IsNotEmpty() + @IsDateString() + date: string; - @IsNotEmpty() - @IsDateString() - date: string; + @IsNotEmpty() + @IsString() + workspace_id: string; - @IsNotEmpty() - @IsString() - workspace_id: string; + //this is the lecturer id + @IsNotEmpty() + @IsString() + lecturer_id: string; - //this is the lecturer id - @IsNotEmpty() - @IsString() - lecturer_id: string; + //@isOptional() + @IsString() + description?: string; - - //@isOptional() - @IsString() - description?: string; - - @IsNotEmpty() - @IsString() - topic: string; -} \ No newline at end of file + @IsNotEmpty() + @IsString() + topic: string; +} diff --git a/src/server/workspace/src/schedule/dto/update-schedule.dto.ts b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts index a11a44a0..0430d65a 100644 --- a/src/server/workspace/src/schedule/dto/update-schedule.dto.ts +++ b/src/server/workspace/src/schedule/dto/update-schedule.dto.ts @@ -1,17 +1,15 @@ -import { IsDateString, IsNotEmpty, IsString} from 'class-validator'; +import { IsDateString, IsNotEmpty, IsString } from 'class-validator'; -export class UpdateScheduleDto{ +export class UpdateScheduleDto { + //@IsNotEmpty() + @IsDateString() + date?: string; - //@IsNotEmpty() - @IsDateString() - date?: string; + //@isOptional() + @IsString() + description?: string; - - //@isOptional() - @IsString() - description?: string; - - @IsNotEmpty() - @IsString() - topic?: string; -} \ No newline at end of file + @IsNotEmpty() + @IsString() + topic?: string; +} diff --git a/src/server/workspace/src/schedule/schedule.controller.ts b/src/server/workspace/src/schedule/schedule.controller.ts index 49c95bd4..664e3a51 100644 --- a/src/server/workspace/src/schedule/schedule.controller.ts +++ b/src/server/workspace/src/schedule/schedule.controller.ts @@ -1,51 +1,51 @@ //this will handle all the http reqs and the responses import { - Get, - Put, - Body, - Post, - Param, - Delete, - Controller, - } from '@nestjs/common'; - - import { ScheduleService } from './schedule.service'; - import { CreateScheduleDto } from './dto/create-schedule.dto'; - import { UpdateScheduleDto } from './dto/update-schedule.dto'; - import { Schedule } from '../schemas/schedule.schema'; - - @Controller('schedules') - export class ScheduleController { - constructor(private readonly scheduleService: ScheduleService) {} - - - @Post() - async create(@Body() createScheduleDto: CreateScheduleDto) { - return this.scheduleService.create(createScheduleDto); - } - - @Get(':id') - async findOne(@Param('id') id: string) { - return this.scheduleService.findOne(id); - } - - @Get('workspace/:workspaceId') - async findAllByWorkspaceId(@Param('workspaceId') workspaceId: string): Promise { - return this.scheduleService.findAllByWorkspaceId(workspaceId); - } - - @Put(':id') - async update( - @Param('id') id: string, - @Body() updateScheduleDto: UpdateScheduleDto, - ) { - return this.scheduleService.update(id, updateScheduleDto); - } - - @Delete(':id') - async delete(@Param('id') id: string) { - return this.scheduleService.delete(id); - } + Get, + Put, + Body, + Post, + Param, + Delete, + Controller, +} from '@nestjs/common'; + +import { ScheduleService } from './schedule.service'; +import { CreateScheduleDto } from './dto/create-schedule.dto'; +import { UpdateScheduleDto } from './dto/update-schedule.dto'; +import { Schedule } from '../schemas/schedule.schema'; + +@Controller('schedules') +export class ScheduleController { + constructor(private readonly scheduleService: ScheduleService) {} + + @Post() + async create(@Body() createScheduleDto: CreateScheduleDto) { + return this.scheduleService.create(createScheduleDto); + } + + @Get(':id') + async findOne(@Param('id') id: string) { + return this.scheduleService.findOne(id); + } + + @Get('workspace/:workspaceId') + async findAllByWorkspaceId( + @Param('workspaceId') workspaceId: string, + ): Promise { + return this.scheduleService.findAllByWorkspaceId(workspaceId); + } + + @Put(':id') + async update( + @Param('id') id: string, + @Body() updateScheduleDto: UpdateScheduleDto, + ) { + return this.scheduleService.update(id, updateScheduleDto); + } + + @Delete(':id') + async delete(@Param('id') id: string) { + return this.scheduleService.delete(id); } - \ No newline at end of file +} diff --git a/src/server/workspace/src/schedule/schedule.module.ts b/src/server/workspace/src/schedule/schedule.module.ts index 486754ed..3b9427d8 100644 --- a/src/server/workspace/src/schedule/schedule.module.ts +++ b/src/server/workspace/src/schedule/schedule.module.ts @@ -3,10 +3,7 @@ import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; -import { - Schedule, - ScheduleSchema, -} from '../schemas/schedule.schema'; +import { Schedule, ScheduleSchema } from '../schemas/schedule.schema'; import { ScheduleService } from './schedule.service'; import { ScheduleController } from './schedule.controller'; @@ -20,4 +17,4 @@ import { ScheduleController } from './schedule.controller'; controllers: [ScheduleController], exports: [ScheduleService], }) -export class ScheduleModule {} \ No newline at end of file +export class ScheduleModule {} diff --git a/src/server/workspace/src/schedule/schedule.service.spec.ts b/src/server/workspace/src/schedule/schedule.service.spec.ts index 30cc2bcc..440e3555 100644 --- a/src/server/workspace/src/schedule/schedule.service.spec.ts +++ b/src/server/workspace/src/schedule/schedule.service.spec.ts @@ -1,7 +1,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ScheduleService } from './schedule.service'; import { getModelToken } from '@nestjs/mongoose'; -import { Model ,Query} from 'mongoose'; +import { Model, Query } from 'mongoose'; import { Schedule } from '../schemas/schedule.schema'; import { UpdateScheduleDto } from './dto/update-schedule.dto'; @@ -39,34 +39,34 @@ describe('ScheduleService', () => { expect(service).toBeDefined(); }); -// describe('create', () => { -// it('should create a schedule', async () => { -// const createScheduleDto: CreateScheduleDto = { -// topic: 'Test Schedule', // Updated to 'topic' -// description: 'This is a test schedule', -// startTime: new Date('2024-06-24T10:00:00Z'), -// endTime: new Date('2024-06-24T12:00:00Z'), -// workspace_id: 'workspace-id-1', // Use string instead of ObjectId -// }; + // describe('create', () => { + // it('should create a schedule', async () => { + // const createScheduleDto: CreateScheduleDto = { + // topic: 'Test Schedule', // Updated to 'topic' + // description: 'This is a test schedule', + // startTime: new Date('2024-06-24T10:00:00Z'), + // endTime: new Date('2024-06-24T12:00:00Z'), + // workspace_id: 'workspace-id-1', // Use string instead of ObjectId + // }; -// const createdSchedule: Schedule = { -// _id: 'dummy-id', // Replace with a mock ID -// ...createScheduleDto, -// }; + // const createdSchedule: Schedule = { + // _id: 'dummy-id', // Replace with a mock ID + // ...createScheduleDto, + // }; -// jest.spyOn(model, 'new').mockReturnValue(createdSchedule); + // jest.spyOn(model, 'new').mockReturnValue(createdSchedule); -// const result = await service.create(createScheduleDto); + // const result = await service.create(createScheduleDto); -// expect(result).toEqual(createdSchedule); -// }); -// }); + // expect(result).toEqual(createdSchedule); + // }); + // }); describe('findOne', () => { it('should find a schedule by id', async () => { const scheduleId = 'dummy-id'; - const foundSchedule= { + const foundSchedule = { _id: scheduleId, topic: 'Found Schedule', // Updated to 'topic' description: 'This is a found schedule', @@ -88,7 +88,7 @@ describe('ScheduleService', () => { describe('findAllByWorkspaceId', () => { it('should call find method and return schedules', async () => { const workspaceId = 'dummy-workspace-id'; - const foundSchedules= [ + const foundSchedules = [ { _id: 'schedule-id-1', topic: 'Schedule 1', @@ -142,7 +142,7 @@ describe('ScheduleService', () => { expect(model.findByIdAndUpdate).toHaveBeenCalledWith( id, updateScheduleDto, - { new: true } + { new: true }, ); expect(result).toEqual(updatedSchedule); }); diff --git a/src/server/workspace/src/schedule/schedule.service.ts b/src/server/workspace/src/schedule/schedule.service.ts index 25f675d9..46d82fd1 100644 --- a/src/server/workspace/src/schedule/schedule.service.ts +++ b/src/server/workspace/src/schedule/schedule.service.ts @@ -1,4 +1,4 @@ -//this will handle all the database querying +//this will handle all the database querying import { Model } from 'mongoose'; import { Injectable } from '@nestjs/common'; @@ -29,7 +29,10 @@ export class ScheduleService { return this.scheduleModel.find({ workspace_id: workspaceId }).exec(); } - async update(id: string, updateScheduleDto: UpdateScheduleDto): Promise { + async update( + id: string, + updateScheduleDto: UpdateScheduleDto, + ): Promise { return this.scheduleModel .findByIdAndUpdate(id, updateScheduleDto, { new: true }) .exec(); @@ -39,5 +42,4 @@ export class ScheduleService { await this.scheduleModel.findByIdAndDelete(id).exec(); return { message: 'Lesson deleted successfully.' }; } - -} \ No newline at end of file +} diff --git a/src/server/workspace/src/schemas/material.schema.ts b/src/server/workspace/src/schemas/material.schema.ts index 3b48f14e..9cee57b4 100644 --- a/src/server/workspace/src/schemas/material.schema.ts +++ b/src/server/workspace/src/schemas/material.schema.ts @@ -1,35 +1,33 @@ import { Document, Types } from 'mongoose'; import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; - //this is the Material schema @Schema({ timestamps: true }) -export class Material extends Document{ - - //this is the type - //either 3d model or pdf - @Prop({required: true}) - type: boolean; - - //this is the workspace id - @Prop({type: Types.ObjectId, ref: 'Workspace', required: true}) - workspace_id: Types.ObjectId; - - //this is the lecturer id - @Prop({type: Types.ObjectId, ref: 'User', required: true}) - lecturer_id: Types.ObjectId; - - //this is the title of the material - @Prop({required: true}) - title: string; - - //this is the description of the material - @Prop({required: true}) - description: string; - - //this is the filepath of the material - @Prop({required: true}) - file_path: string; +export class Material extends Document { + //this is the type + //either 3d model or pdf + @Prop({ required: true }) + type: boolean; + + //this is the workspace id + @Prop({ type: Types.ObjectId, ref: 'Workspace', required: true }) + workspace_id: Types.ObjectId; + + //this is the lecturer id + @Prop({ type: Types.ObjectId, ref: 'User', required: true }) + lecturer_id: Types.ObjectId; + + //this is the title of the material + @Prop({ required: true }) + title: string; + + //this is the description of the material + @Prop({ required: true }) + description: string; + + //this is the filepath of the material + @Prop({ required: true }) + file_path: string; } -export const MaterialSchema = SchemaFactory.createForClass(Material); \ No newline at end of file +export const MaterialSchema = SchemaFactory.createForClass(Material); diff --git a/src/server/workspace/src/schemas/schedule.schema.ts b/src/server/workspace/src/schemas/schedule.schema.ts index 8e6af2f0..9024abd9 100644 --- a/src/server/workspace/src/schemas/schedule.schema.ts +++ b/src/server/workspace/src/schemas/schedule.schema.ts @@ -1,31 +1,28 @@ import { Document, Types } from 'mongoose'; import { Schema, Prop, SchemaFactory } from '@nestjs/mongoose'; - //this is the Schedule schema @Schema({ timestamps: true }) -export class Schedule extends Document{ - - //this is the workspace id - @Prop({type: Types.ObjectId, ref: 'Workspace', required: true}) - workspace_id: Types.ObjectId; - - //this is the lecturer id - @Prop({type: Types.ObjectId, ref: 'User', required: true}) - lecturer_id: Types.ObjectId; - - //this is the title of the lesson - @Prop({required: true}) - topic: string; - - //this is the description of the lesson - @Prop({required: false}) - description: string; - - //this is the date of the lesson - @Prop({required: true}) - date: string; - +export class Schedule extends Document { + //this is the workspace id + @Prop({ type: Types.ObjectId, ref: 'Workspace', required: true }) + workspace_id: Types.ObjectId; + + //this is the lecturer id + @Prop({ type: Types.ObjectId, ref: 'User', required: true }) + lecturer_id: Types.ObjectId; + + //this is the title of the lesson + @Prop({ required: true }) + topic: string; + + //this is the description of the lesson + @Prop({ required: false }) + description: string; + + //this is the date of the lesson + @Prop({ required: true }) + date: string; } -export const ScheduleSchema = SchemaFactory.createForClass(Schedule); \ No newline at end of file +export const ScheduleSchema = SchemaFactory.createForClass(Schedule); diff --git a/src/server/workspace/src/user/user.controller.ts b/src/server/workspace/src/user/user.controller.ts index 02e188ba..88723d63 100644 --- a/src/server/workspace/src/user/user.controller.ts +++ b/src/server/workspace/src/user/user.controller.ts @@ -28,7 +28,7 @@ export class UserController { @Get() async getUsers(@Query() query: Partial) { - return await this.userService.findMany({...query}); + return await this.userService.findMany({ ...query }); } @Put(':id') diff --git a/src/server/workspace/src/user/user.service.ts b/src/server/workspace/src/user/user.service.ts index cf2f3fe0..d5209cc6 100644 --- a/src/server/workspace/src/user/user.service.ts +++ b/src/server/workspace/src/user/user.service.ts @@ -48,7 +48,10 @@ export class UserService { } async findMany(filter: Partial): Promise { - const users = await this.userModel.find(filter).sort({ createdAt: -1 }).exec(); + const users = await this.userModel + .find(filter) + .sort({ createdAt: -1 }) + .exec(); return users; } diff --git a/src/server/workspace/src/workspace/workspace.controller.ts b/src/server/workspace/src/workspace/workspace.controller.ts index e3f4b362..60b30c16 100644 --- a/src/server/workspace/src/workspace/workspace.controller.ts +++ b/src/server/workspace/src/workspace/workspace.controller.ts @@ -23,7 +23,9 @@ export class WorkspaceController { } @Get('organisation/:organisationId') - async findAllByOrganisationId(@Param('organisationId') organisationId: string): Promise { + async findAllByOrganisationId( + @Param('organisationId') organisationId: string, + ): Promise { return this.workspaceService.findAllByOrganisationId(organisationId); } From debbbbe30dbb5330073e261f4b59001515fba487 Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Sat, 22 Jun 2024 17:45:45 +0200 Subject: [PATCH 24/25] fixed all tests --- .../src/schedule/schedule.controller.spec.ts | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/server/workspace/src/schedule/schedule.controller.spec.ts diff --git a/src/server/workspace/src/schedule/schedule.controller.spec.ts b/src/server/workspace/src/schedule/schedule.controller.spec.ts new file mode 100644 index 00000000..16af234c --- /dev/null +++ b/src/server/workspace/src/schedule/schedule.controller.spec.ts @@ -0,0 +1,109 @@ +// schedule.controller.spec.ts +import { Test, TestingModule } from '@nestjs/testing'; +import { ScheduleController } from './schedule.controller'; +import { ScheduleService } from './schedule.service'; +//import { CreateScheduleDto } from './dto/create-schedule.dto'; +import { UpdateScheduleDto } from './dto/update-schedule.dto'; +//import { Schedule } from '../schemas/schedule.schema'; + +describe('ScheduleController', () => { + let controller: ScheduleController; + let service: ScheduleService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [ScheduleController], + providers: [ + { + provide: ScheduleService, + useValue: { + //create: jest.fn(), + findOne: jest.fn(), + findAllByWorkspaceId: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }, + ], + }).compile(); + + controller = module.get(ScheduleController); + service = module.get(ScheduleService); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + +// describe('create', () => { +// it('should create a new schedule', async () => { +// const createDto: CreateScheduleDto = { +// date: '2024-06-24T10:00:00Z', +// workspace_id: 'workspace-id-1', +// lecturer_id: 'lecturer-id-1', +// description: 'Sample description', +// topic: 'Sample topic', +// }; + +// const createdSchedule: Schedule = { +// _id: '6037bce2df95b73e28bc7227', +// ...createDto, +// }; + +// jest.spyOn(scheduleService, 'create').mockResolvedValue(createdSchedule); + +// const result = await controller.create(createDto); + +// expect(result).toEqual(createdSchedule); +// }); +// }); + +describe('findOne', () => { + it('should call the findOne method of the service', async () => { + const id = 'test-id'; + + await controller.findOne(id); + + expect(service.findOne).toHaveBeenCalledWith(id); + }); +}); + +describe('findAllByWorkspaceId', () => { + it('should call the findAllByWorkspaceId method of the service', async () => { + const workspaceId = 'workspace-id-1'; + + await controller.findAllByWorkspaceId(workspaceId); + + expect(service.findAllByWorkspaceId).toHaveBeenCalledWith(workspaceId); + }); +}); + +describe('update', () => { + it('should call the update method of the service', async () => { + const id = 'test-id'; + const updateScheduleDto: UpdateScheduleDto = { + topic: 'Updated Material', + description: 'Updated Description', + date: '/path/to/updated-file.pdf', + }; + + await controller.update(id, updateScheduleDto); + + expect(service.update).toHaveBeenCalledWith(id, updateScheduleDto); + }); +}); + +describe('delete', () => { + it('should call the delete method of the service', async () => { + const id = 'test-id'; + + await controller.delete(id); + + expect(service.delete).toHaveBeenCalledWith(id); + }); +}); +}); From 92d844b74bc535eda5415c83ee778e07c2a6e05f Mon Sep 17 00:00:00 2001 From: ayandajuqu Date: Sat, 22 Jun 2024 17:48:11 +0200 Subject: [PATCH 25/25] changed probles --- src/server/workspace/src/material/dto/create-material.dto.ts | 2 +- src/server/workspace/src/material/material.service.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/workspace/src/material/dto/create-material.dto.ts b/src/server/workspace/src/material/dto/create-material.dto.ts index 5c89f649..22e0135f 100644 --- a/src/server/workspace/src/material/dto/create-material.dto.ts +++ b/src/server/workspace/src/material/dto/create-material.dto.ts @@ -1,4 +1,4 @@ -import { IsNotEmpty, IsOptional, IsString, IsUrl, isBoolean } from 'class-validator'; +import { IsNotEmpty, IsString } from 'class-validator'; //this class just encapsulates data and does validation export class CreateMaterialDto{ diff --git a/src/server/workspace/src/material/material.service.spec.ts b/src/server/workspace/src/material/material.service.spec.ts index 2680557f..3038d789 100644 --- a/src/server/workspace/src/material/material.service.spec.ts +++ b/src/server/workspace/src/material/material.service.spec.ts @@ -2,7 +2,7 @@ import { Test, TestingModule } from '@nestjs/testing'; import { MaterialService } from './material.service'; -import { CreateMaterialDto } from './dto/create-material.dto'; +//import { CreateMaterialDto } from './dto/create-material.dto'; import { UpdateMaterialDto } from './dto/update-material.dto'; import { Material } from '../schemas/material.schema'; import { getModelToken } from '@nestjs/mongoose';