From 8c8248f8c0f71212af1ae5e1a7c4dc8ff693310c Mon Sep 17 00:00:00 2001 From: Phill Pover Date: Mon, 7 Apr 2025 00:46:36 +0100 Subject: [PATCH] Fixing song create and update --- backend/src/album/album.controller.ts | 4 ++- backend/src/main.ts | 2 ++ backend/src/song/song.controller.ts | 4 ++- backend/src/song/song.entity.ts | 2 +- backend/src/song/song.service.ts | 40 +++++++++++++++++---------- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/backend/src/album/album.controller.ts b/backend/src/album/album.controller.ts index face353..2fc9045 100644 --- a/backend/src/album/album.controller.ts +++ b/backend/src/album/album.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, UsePipes, ValidationPipe } from '@nestjs/common'; import { AlbumService } from './album.service'; import { Album } from './album.entity'; import { CreateAlbumDto } from './dto/create-album.dto'; @@ -20,11 +20,13 @@ export class AlbumController { } @Post() + @UsePipes(new ValidationPipe({ transform: true })) async create(@Body() createAlbumDto: CreateAlbumDto): Promise { return this.albumService.create(createAlbumDto); } @Put(':id') + @UsePipes(new ValidationPipe({ transform: true })) async update(@Param('id') id: number, @Body() updateAlbumDto: UpdateAlbumDto): Promise { return this.albumService.update(id, updateAlbumDto); } diff --git a/backend/src/main.ts b/backend/src/main.ts index 48f4521..87a3f78 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -1,4 +1,5 @@ import { NestFactory } from '@nestjs/core'; +import { ValidationPipe } from '@nestjs/common'; import { AppModule } from './app.module'; async function bootstrap() { @@ -9,6 +10,7 @@ async function bootstrap() { credentials: true, allowedHeaders: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept, Observe', }); + app.useGlobalPipes(new ValidationPipe()); await app.listen(process.env.PORT ?? 3000); } bootstrap(); diff --git a/backend/src/song/song.controller.ts b/backend/src/song/song.controller.ts index 7eb794a..a6d5afb 100644 --- a/backend/src/song/song.controller.ts +++ b/backend/src/song/song.controller.ts @@ -1,4 +1,4 @@ -import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, Post, Put, UsePipes, ValidationPipe } from '@nestjs/common'; import { SongService } from './song.service'; import { Song } from './song.entity'; import { CreateSongDto } from './dto/create-song.dto'; @@ -20,11 +20,13 @@ export class SongController { } @Post() + @UsePipes(new ValidationPipe({ transform: true })) async create(@Body() createSongDto: CreateSongDto): Promise { return this.songService.create(createSongDto); } @Put(':id') + @UsePipes(new ValidationPipe({ transform: true })) async update(@Param('id') id: number, @Body() updateSongDto: UpdateSongDto): Promise { return this.songService.update(id, updateSongDto); } diff --git a/backend/src/song/song.entity.ts b/backend/src/song/song.entity.ts index f2f08b0..862cfdd 100644 --- a/backend/src/song/song.entity.ts +++ b/backend/src/song/song.entity.ts @@ -15,6 +15,6 @@ export class Song { @Column() trackNumber: number - @ManyToOne(() => Album, (album) => album.songs) + @ManyToOne(() => Album, (album) => album.songs, { cascade: true }) album: Album } diff --git a/backend/src/song/song.service.ts b/backend/src/song/song.service.ts index e61db57..f1e76ac 100644 --- a/backend/src/song/song.service.ts +++ b/backend/src/song/song.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { Album } from '../album/album.entity'; import { Song } from './song.entity'; import { CreateSongDto } from './dto/create-song.dto'; import { UpdateSongDto } from './dto/update-song.dto'; @@ -9,7 +10,9 @@ import { UpdateSongDto } from './dto/update-song.dto'; export class SongService { constructor( @InjectRepository(Song) - private songRepository: Repository + private songRepository: Repository, + @InjectRepository(Album) + private albumRepository: Repository ) {} findAll(): Promise { @@ -25,26 +28,33 @@ export class SongService { } async create(createSongDto: CreateSongDto): Promise { - const song = this.songRepository.create({ - title: createSongDto.title, - duration: createSongDto.duration, - trackNumber: createSongDto.trackNumber - }); - const savedSong = await this.songRepository.save(song); - return savedSong.id; + const album = await this.albumRepository.findOneBy({id: createSongDto.albumId}); + if (album) { + const song = new Song(); + song.title = createSongDto.title; + song.duration = createSongDto.duration; + song.trackNumber = createSongDto.trackNumber; + song.album = album; + const savedSong = await this.songRepository.save(song); + return savedSong.id; + } else { + throw new Error(`Unable to find Album with ID ${createSongDto.albumId}`); + } } async update(id: number, updateSongDto: UpdateSongDto): Promise { if (id === updateSongDto.id) { - const song = this.songRepository.findOneBy({ id: updateSongDto.id }); - if (!song) + const album = await this.albumRepository.findOneBy({id: updateSongDto.albumId}); + const songToUpdate = await this.songRepository.findOneBy({ id: updateSongDto.id }); + if (!songToUpdate || !album) return "Song not found"; - await this.songRepository.update({ id: updateSongDto.id }, { - title: updateSongDto.title, - duration: updateSongDto.duration, - trackNumber: updateSongDto.trackNumber - }); + songToUpdate.id = updateSongDto.id; + songToUpdate.title = updateSongDto.title; + songToUpdate.duration = updateSongDto.duration; + songToUpdate.trackNumber = updateSongDto.trackNumber; + songToUpdate.album = album; + await this.songRepository.update({ id: updateSongDto.id }, songToUpdate); return "Song updated successfully"; } else { return "Song ID does not match posted data"