Compare commits

..

4 commits

Author SHA1 Message Date
7093a76d17 Shows/schema: add genre reference 2025-02-07 14:07:03 +01:00
ec1a032a35 Genres: complete controller 2025-02-07 13:58:55 +01:00
66ccbe88e9 Genres/schema: fix spelling 2025-02-07 13:54:42 +01:00
a3dd007bde Genres: complete service 2025-02-07 12:59:33 +01:00
4 changed files with 115 additions and 30 deletions

View file

@ -1,33 +1,105 @@
import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import {
Controller,
Get,
Post,
Body,
Param,
Delete,
BadRequestException,
Query,
InternalServerErrorException,
NotFoundException,
} from '@nestjs/common';
import { GenresService } from './genres.service';
import { GenreDto } from './dto/genre.dto';
import { PaginationDto } from 'src/pagination.dto';
@Controller('genres')
export class GenresController {
constructor(private readonly genresService: GenresService) {}
@Post()
create(@Body() dto: GenreDto) {
return this.genresService.create(dto);
async create(@Body() dto: GenreDto) {
try {
const newGenre = await this.genresService.create(dto);
return {
status: 'Ok',
message: 'Genre was created successfully',
newId: newGenre._id,
};
} catch (error) {
throw new BadRequestException({
status: 'Bad request',
message: error.message,
});
}
}
@Get()
findAll() {
return this.genresService.findAll();
async findAll(@Query() pagination: PaginationDto) {
try {
const { page, limit } = pagination;
const serviceResponse = await this.genresService.findAll(page, limit);
return {
status: 'Ok',
genres: serviceResponse.genres,
genreCount: serviceResponse.genreCount,
};
} catch (error) {
throw new InternalServerErrorException({
status: error.name,
message: error.message,
});
}
}
@Get(':id')
findOne(@Param('id') id: string) {
return this.genresService.findOne(+id);
@Get('/id/:id')
async findOne(@Param('id') id: string) {
try {
const genre = await this.genresService.findId(id);
if (genre) {
return { status: 'Ok', genre: genre };
} else {
throw new NotFoundException({
status: 'Error',
message: `Can't find genre with id ${id}`,
});
}
} catch (error) {
if (error instanceof NotFoundException) {
throw error;
}
throw new InternalServerErrorException({
status: error.name,
message: error.message,
});
}
}
@Patch(':id')
update(@Param('id') id: string, @Body() dto: GenreDto) {
return this.genresService.update(+id, dto);
}
@Delete(':id')
remove(@Param('id') id: string) {
return this.genresService.remove(+id);
@Delete('/id/:id')
async remove(@Param('id') id: string) {
try {
const deletedMovie = await this.genresService.remove(id);
if (!deletedMovie) {
throw new NotFoundException({
status: 'Error',
message: `Can't find genre with id ${id}`,
});
} else {
return {
status: 'Ok',
message: 'Genre removed successfully',
};
}
} catch (error) {
if (error instanceof NotFoundException) {
throw error;
} else {
throw new InternalServerErrorException({
status: error.name,
message: error.message,
});
}
}
}
}

View file

@ -1,25 +1,38 @@
import { Injectable } from '@nestjs/common';
import { GenreDto } from './dto/genre.dto';
import { InjectModel } from '@nestjs/mongoose';
import { Genre } from './entities/genre.entity';
import { Model } from 'mongoose';
@Injectable()
export class GenresService {
create(dto: GenreDto) {
return 'This action adds a new genre';
constructor(@InjectModel('Genre') private genreModel: Model<Genre>) {}
async create(dto: GenreDto): Promise<any> {
const genre = new this.genreModel(dto);
return genre.save();
}
findAll() {
return `This action returns all genres`;
async findAll(page: number, genresPerPage: number): Promise<any> {
let genres;
if (genresPerPage !== undefined) {
const skip = (page - 1) * genresPerPage;
genres = await this.genreModel.find().skip(skip).limit(genresPerPage);
} else {
genres = await this.genreModel.find();
}
const total = await this.genreModel.countDocuments();
return {
genres: genres,
genreCount: total,
};
}
findOne(id: number) {
return `This action returns a #${id} genre`;
async findId(id: string): Promise<any> {
return this.genreModel.findById(id);
}
update(id: number, dto: GenreDto) {
return `This action updates a #${id} genre`;
}
remove(id: number) {
return `This action removes a #${id} genre`;
async remove(id: string): Promise<any> {
return this.genreModel.findByIdAndDelete(id);
}
}

View file

@ -2,5 +2,5 @@ import { Schema } from 'mongoose';
export const GenreSchema = new Schema({
name: { type: String, required: true },
showsIDs: [{ type: Schema.Types.ObjectId, ref: 'Show' }],
showIDs: [{ type: Schema.Types.ObjectId, ref: 'Show' }],
});

View file

@ -6,6 +6,6 @@ export const ShowSchema = new Schema({
seasons: { type: Number, required: true },
episodes: { type: Number, required: true },
description: { type: String, required: true },
genres: [{ type: String, required: true }],
genres: [{ type: Schema.Types.ObjectId, required: true, ref: 'Genre' }],
images: [{ type: String, required: true }],
});