From f3d08f82f5d0d083f04317b0d20137ec82e4f6f4 Mon Sep 17 00:00:00 2001 From: Dan Date: Tue, 21 Nov 2023 08:49:20 +0000 Subject: [PATCH] WIP upload controller --- package-lock.json | 10 ++++++ packages/bridge-server/package.json | 1 + packages/bridge-server/src/app.module.ts | 3 +- .../src/upload/upload.controller.spec.ts | 18 +++++++++++ .../src/upload/upload.controller.ts | 14 ++++++++ .../upload-replay-dialog.component.ts | 32 +++++++++++++------ .../season-details.component.ts | 5 ++- .../src/app/services/replays.service.spec.ts | 16 ++++++++++ .../src/app/services/replays.service.ts | 19 +++++++++++ 9 files changed, 106 insertions(+), 12 deletions(-) create mode 100644 packages/bridge-server/src/upload/upload.controller.spec.ts create mode 100644 packages/bridge-server/src/upload/upload.controller.ts create mode 100644 packages/bridge-ui/src/app/services/replays.service.spec.ts create mode 100644 packages/bridge-ui/src/app/services/replays.service.ts diff --git a/package-lock.json b/package-lock.json index 88dce80..e19b1fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7469,6 +7469,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, + "node_modules/@types/multer": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", + "integrity": "sha512-svK240gr6LVWvv3YGyhLlA+6LRRWA4mnGIU7RcNmgjBYFl6665wcXrRfxGp5tEPVHUNm5FMcmq7too9bxCwX/w==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/node": { "version": "20.9.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.9.2.tgz", @@ -23420,6 +23429,7 @@ "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", + "@types/multer": "^1.4.11", "@types/node": "^20.3.1", "@types/sequelize": "^4.28.18", "@types/supertest": "^2.0.12", diff --git a/packages/bridge-server/package.json b/packages/bridge-server/package.json index 630e556..1f5d5bd 100644 --- a/packages/bridge-server/package.json +++ b/packages/bridge-server/package.json @@ -38,6 +38,7 @@ "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", + "@types/multer": "^1.4.11", "@types/node": "^20.3.1", "@types/sequelize": "^4.28.18", "@types/supertest": "^2.0.12", diff --git a/packages/bridge-server/src/app.module.ts b/packages/bridge-server/src/app.module.ts index 4321248..076cc60 100644 --- a/packages/bridge-server/src/app.module.ts +++ b/packages/bridge-server/src/app.module.ts @@ -9,6 +9,7 @@ import { UsersModule } from './users/users.module'; import { LoggerMiddleware } from './auth/logger.middleware'; import { SeasonsController } from './seasons/seasons.controller'; +import { UploadController } from './upload/upload.controller'; @Module({ imports: [ @@ -21,7 +22,7 @@ import { SeasonsController } from './seasons/seasons.controller'; AuthModule, UsersModule, ], - controllers: [AppController, SeasonsController], + controllers: [AppController, SeasonsController, UploadController], providers: [AppService, UsersService], }) export class AppModule { diff --git a/packages/bridge-server/src/upload/upload.controller.spec.ts b/packages/bridge-server/src/upload/upload.controller.spec.ts new file mode 100644 index 0000000..cd3d2d2 --- /dev/null +++ b/packages/bridge-server/src/upload/upload.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { UploadController } from './upload.controller'; + +describe('UploadController', () => { + let controller: UploadController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [UploadController], + }).compile(); + + controller = module.get(UploadController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/packages/bridge-server/src/upload/upload.controller.ts b/packages/bridge-server/src/upload/upload.controller.ts new file mode 100644 index 0000000..2fbc29e --- /dev/null +++ b/packages/bridge-server/src/upload/upload.controller.ts @@ -0,0 +1,14 @@ +import { Controller, Post, UseInterceptors } from '@nestjs/common'; +import { FileInterceptor } from '@nestjs/platform-express'; +import { Body, UploadedFile } from '@nestjs/common/decorators'; +import { Express } from 'express' + +@Controller('upload') +export class UploadController { + @Post('replay') + @UseInterceptors(FileInterceptor('file')) + uploadFile(@UploadedFile() file: Express.Multer.File, @Body() body: any) { + console.log(body); + console.log(file); + } +} diff --git a/packages/bridge-ui/src/app/components/upload-replay-dialog/upload-replay-dialog.component.ts b/packages/bridge-ui/src/app/components/upload-replay-dialog/upload-replay-dialog.component.ts index 1dddb45..b12f447 100644 --- a/packages/bridge-ui/src/app/components/upload-replay-dialog/upload-replay-dialog.component.ts +++ b/packages/bridge-ui/src/app/components/upload-replay-dialog/upload-replay-dialog.component.ts @@ -1,4 +1,4 @@ -import { Component } from '@angular/core'; +import { Component, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ReactiveFormsModule, FormControl } from '@angular/forms'; import { FormsModule } from '@angular/forms'; @@ -12,6 +12,8 @@ import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatIconModule } from '@angular/material/icon'; +import { ReplaysService } from '../../services/replays.service'; + @Component({ selector: 'app-upload-replay-dialog', standalone: true, @@ -35,6 +37,14 @@ import { MatIconModule } from '@angular/material/icon'; export class UploadReplayDialogComponent { fileName: string = ""; file?: File; + seasonId: string; + + constructor( + private replaysService: ReplaysService, + @Inject(MAT_DIALOG_DATA) additionalData: any, + ) { + this.seasonId = additionalData.seasonId; + } onFileSelected(event: any) { const file: File = event.target.files[0]; @@ -45,14 +55,16 @@ export class UploadReplayDialogComponent { } } - onClickSubmit() { - /* - let formData = new FormData(); - formData.append("file", file); - let local = this.seasonId.seasonId; - formData.append("seasonId", local); - const upload$ = this.apiService.postReplayUpload(formData); - upload$.subscribe(); - */ + onClickSubmit() { + if(this.file == undefined) { + return; + } + + let formData = new FormData(); + formData.append("file", this.file); + let local = this.seasonId; + formData.append("seasonId", local); + const upload$ = this.replaysService.uploadReplay(formData); + upload$.subscribe(); } } diff --git a/packages/bridge-ui/src/app/pages/season-details/season-details.component.ts b/packages/bridge-ui/src/app/pages/season-details/season-details.component.ts index e753a1d..ead2782 100644 --- a/packages/bridge-ui/src/app/pages/season-details/season-details.component.ts +++ b/packages/bridge-ui/src/app/pages/season-details/season-details.component.ts @@ -62,6 +62,9 @@ export class SeasonDetailsComponent { } openUploadReplayDialog(id: string) { - this.dialog.open(UploadReplayDialogComponent); + this.dialog.open(UploadReplayDialogComponent, + { + data: { seasonId: id } + }); } } diff --git a/packages/bridge-ui/src/app/services/replays.service.spec.ts b/packages/bridge-ui/src/app/services/replays.service.spec.ts new file mode 100644 index 0000000..7cee5d5 --- /dev/null +++ b/packages/bridge-ui/src/app/services/replays.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ReplaysService } from './replays.service'; + +describe('ReplaysService', () => { + let service: ReplaysService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ReplaysService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/packages/bridge-ui/src/app/services/replays.service.ts b/packages/bridge-ui/src/app/services/replays.service.ts new file mode 100644 index 0000000..d9c8cbb --- /dev/null +++ b/packages/bridge-ui/src/app/services/replays.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from "@angular/common/http"; +import { Observable } from "rxjs"; + +@Injectable({ + providedIn: 'root' +}) +export class ReplaysService { + server_route: string = "http://localhost:3000/" + + constructor(private httpClient: HttpClient) { + } + + uploadReplay(newReplay: FormData) { + const headers = new HttpHeaders(); + headers.append('Content-Type', 'multipart/form-data'); + return this.httpClient.post(this.server_route+'upload/replay', newReplay, { headers }); + } +}