From bcff3547ea7e99b275df391087bcaaf0d3a02c5d Mon Sep 17 00:00:00 2001 From: Phill Pover Date: Mon, 7 Apr 2025 06:59:49 +0100 Subject: [PATCH] Adding unique album validator --- backend/src/album/album.entity.ts | 1 + .../middleware/uniqueAlbumTitle.middleware.ts | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 backend/src/album/middleware/uniqueAlbumTitle.middleware.ts diff --git a/backend/src/album/album.entity.ts b/backend/src/album/album.entity.ts index 473a51a..50657b7 100644 --- a/backend/src/album/album.entity.ts +++ b/backend/src/album/album.entity.ts @@ -1,5 +1,6 @@ import { Entity, Column, OneToMany, PrimaryGeneratedColumn } from 'typeorm'; import { IsNotEmpty, IsString } from 'class-validator'; +import { AlbumTitleUnique } from './middleware/uniqueAlbumTitle.middleware'; import { Song } from '../song/song.entity'; @Entity() diff --git a/backend/src/album/middleware/uniqueAlbumTitle.middleware.ts b/backend/src/album/middleware/uniqueAlbumTitle.middleware.ts new file mode 100644 index 0000000..c69efd1 --- /dev/null +++ b/backend/src/album/middleware/uniqueAlbumTitle.middleware.ts @@ -0,0 +1,32 @@ +import { registerDecorator, ValidationOptions, ValidatorConstraint, ValidatorConstraintInterface } from 'class-validator'; +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; + +@ValidatorConstraint({ async: true }) +export class UniqueAlbumTitle implements ValidatorConstraintInterface { + constructor(@InjectRepository(Album) + private albumRepository: Repository +) {} + + validate(albumTitle: string) { + return this.albumRepository.findOneBy({ + where: { + id: title + }).then((albumTitle) => { + return albumTitle === undefined; + }); + } +} + +export function AlbumTitleUnique(validationOptions?: ValidationOptions) { + return function (object: object, propertyName: string) { + registerDecorator({ + target: object.constructor, + propertyName: propertyName, + options: validationOptions, + constraints: [], + validator: AlbumTitleUnique, + }); + }; +}