chore: complete criticism module

This commit is contained in:
Matin
2025-01-27 12:26:37 +03:30
parent c3bcfd3ef0
commit 5bdf7baceb
11 changed files with 184 additions and 1 deletions
@@ -0,0 +1,25 @@
import { ApiProperty } from "@nestjs/swagger";
import { IsNotEmpty, IsOptional, IsString } from "class-validator";
import { CriticismMessage } from "../../../common/enums/message.enum";
export class CreateCriticismDto {
@IsNotEmpty({ message: CriticismMessage.TITLE_IS_REQUIRED })
@IsString({ message: CriticismMessage.TITLE_STRING })
@ApiProperty({ type: String, description: "title of criticism", example: "انتقاد بابت مشکلات" })
title: string;
@IsNotEmpty({ message: CriticismMessage.CONTENT_IS_REQUIRED })
@IsString({ message: CriticismMessage.CONTENT_IS_STRING })
@ApiProperty({ type: String, description: "description of criticism", example: "متن انتقاد" })
content: string;
@IsOptional()
@IsNotEmpty()
@IsString({ each: true })
@ApiProperty({
description: "The ulr of the criticism files",
example: ["https://example.com/image1.png", "https://example.com/image2.png"],
})
files: string[];
}
@@ -0,0 +1,37 @@
import { Body, Controller, Delete, Get, Param, Post } from "@nestjs/common";
import { ApiOperation, ApiTags } from "@nestjs/swagger";
import { CreateCriticismDto } from "./DTO/create-criticism.dto";
import { CriticismsService } from "./providers/criticisms.service";
import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
import { Roles } from "../../common/decorators/roles.decorator";
import { ParamDto } from "../../common/DTO/param.dto";
import { RoleEnum } from "../users/enums/role.enum";
@Controller("criticisms")
@ApiTags("Criticism")
export class CriticismController {
constructor(private readonly criticismService: CriticismsService) {}
@ApiOperation({ summary: "Create a new criticism" })
@Post()
create(@Body() createDto: CreateCriticismDto) {
return this.criticismService.create(createDto);
}
@AuthGuards()
@Roles(RoleEnum.ADMIN)
@ApiOperation({ summary: "Get all Criticism ===> login as admin" })
@Get()
findAll() {
return this.criticismService.findAll();
}
@AuthGuards()
@Roles(RoleEnum.ADMIN)
@ApiOperation({ summary: "Delete one Criticism with id ===> login as admin" })
@Delete(":id")
delete(@Param() paramDto: ParamDto) {
return this.criticismService.delete(paramDto.id);
}
}
@@ -0,0 +1,17 @@
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { CriticismController } from "./criticisms.controller";
import { CriticismFile } from "./entities/criticism-file.entity";
import { Criticism } from "./entities/criticism.entity";
import { CriticismsService } from "./providers/criticisms.service";
import { CriticismFileRepository } from "./repositories/criticisms-file.repository";
import { CriticismRepository } from "./repositories/criticisms.repository";
@Module({
imports: [TypeOrmModule.forFeature([Criticism, CriticismFile])],
providers: [CriticismsService, CriticismRepository, CriticismFileRepository],
controllers: [CriticismController],
exports: [],
})
export class CriticismModule {}
@@ -0,0 +1,13 @@
import { Column, Entity, ManyToOne } from "typeorm";
import { Criticism } from "./criticism.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
@Entity()
export class CriticismFile extends BaseEntity {
@Column({ type: "varchar", length: 255 })
fileUrl: string;
@ManyToOne(() => Criticism, (criticism) => criticism.files, { nullable: false, onDelete: "CASCADE" })
criticism: Criticism[];
}
@@ -0,0 +1,19 @@
import { Column, Entity, OneToMany } from "typeorm";
import { CriticismFile } from "./criticism-file.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
@Entity()
export class Criticism extends BaseEntity {
@Column({ type: "int", generated: "identity", insert: false })
numericId: number;
@Column({ type: "varchar", length: 150, nullable: false })
title: string;
@Column({ type: "text", nullable: false })
content: string;
@OneToMany(() => CriticismFile, (criticismFile) => criticismFile.criticism, { eager: true, cascade: true })
files: CriticismFile[];
}
@@ -0,0 +1,38 @@
import { BadRequestException, Injectable } from "@nestjs/common";
import { CommonMessage } from "../../../common/enums/message.enum";
import { CreateCriticismDto } from "../DTO/create-criticism.dto";
import { CriticismRepository } from "../repositories/criticisms.repository";
@Injectable()
export class CriticismsService {
constructor(private readonly criticismRepository: CriticismRepository) {}
async create(createDto: CreateCriticismDto) {
const files = createDto.files.map((file) => {
return { fileUrl: file };
});
const criticism = this.criticismRepository.create({
...createDto,
files,
});
await this.criticismRepository.save(criticism);
return {
message: CommonMessage.CREATED,
criticism,
};
}
async findAll() {
return await this.criticismRepository.find({});
}
async delete(id: string) {
const criticism = await this.criticismRepository.findOneBy({ id });
if (!criticism) throw new BadRequestException();
await this.criticismRepository.remove(criticism);
return {
message: CommonMessage.DELETED,
};
}
}
@@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { CriticismFile } from "../entities/criticism-file.entity";
@Injectable()
export class CriticismFileRepository extends Repository<CriticismFile> {
constructor(@InjectRepository(CriticismFile) criticismFileRepository: Repository<CriticismFile>) {
super(criticismFileRepository.target, criticismFileRepository.manager, criticismFileRepository.queryRunner);
}
}
@@ -0,0 +1,12 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { Criticism } from "../entities/criticism.entity";
@Injectable()
export class CriticismRepository extends Repository<Criticism> {
constructor(@InjectRepository(Criticism) criticismRepository: Repository<Criticism>) {
super(criticismRepository.target, criticismRepository.manager, criticismRepository.queryRunner);
}
}