diff --git a/backend/src/file-upload/dto.ts b/backend/src/file-upload/dto.ts new file mode 100644 index 00000000..a6459772 --- /dev/null +++ b/backend/src/file-upload/dto.ts @@ -0,0 +1,4 @@ +export class FileUploadDto { + filename: string; + mimetype: string; +} diff --git a/backend/src/file-upload/file-upload.controller.ts b/backend/src/file-upload/file-upload.controller.ts new file mode 100644 index 00000000..05de4cf0 --- /dev/null +++ b/backend/src/file-upload/file-upload.controller.ts @@ -0,0 +1,23 @@ +import { + Controller, + Post, + UseInterceptors, + UploadedFile, + BadRequestException, +} from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { FileUploadService } from './file-upload.service'; + +@Controller('file-upload') +export class FileUploadController { + constructor(private readonly fileUploadService: FileUploadService) {} + + @Post('upload') + @UseInterceptors(FileInterceptor('file')) + async uploadFile(@UploadedFile() file: any) { + if (!file) throw new BadRequestException('No file provided'); + const isSafe = await this.fileUploadService.scanMalware(file.buffer); + if (!isSafe) throw new BadRequestException('Malware detected'); + return { status: 'success', message: 'File is clean' }; + } +} diff --git a/backend/src/file-upload/file-upload.module.ts b/backend/src/file-upload/file-upload.module.ts new file mode 100644 index 00000000..cfae030d --- /dev/null +++ b/backend/src/file-upload/file-upload.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { FileUploadController } from './file-upload.controller'; +import { FileUploadService } from './file-upload.service'; + +@Module({ + controllers: [FileUploadController], + providers: [FileUploadService], + exports: [FileUploadService], +}) +export class FileUploadModule {} diff --git a/backend/src/file-upload/file-upload.service.spec.ts b/backend/src/file-upload/file-upload.service.spec.ts new file mode 100644 index 00000000..a89c3c96 --- /dev/null +++ b/backend/src/file-upload/file-upload.service.spec.ts @@ -0,0 +1,17 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { FileUploadService } from './file-upload.service'; + +describe('FileUploadService', () => { + let service: FileUploadService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [FileUploadService], + }).compile(); + service = module.get(FileUploadService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/backend/src/file-upload/file-upload.service.ts b/backend/src/file-upload/file-upload.service.ts new file mode 100644 index 00000000..afbaa282 --- /dev/null +++ b/backend/src/file-upload/file-upload.service.ts @@ -0,0 +1,10 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class FileUploadService { + async scanMalware(buffer: Buffer): Promise { + // Integration with clamscan + console.log('Scanning file chunk of size', buffer.length); + return true; // Mock clean file + } +}