유저(1) - 레시피(n)와 1:n관계
리뷰(n) - 유저(1)랑 1:n관계 / 레시피(1)와 1:n 관계
찜(n) - 유저(1)랑 1:n관계 / 레시피(1)와 1:n 관계
파일 - 사진과 1:n관계 / 레시피와 n:m 관계
https://typeorm.io/#/many-to-one-one-to-many-relations
@OneToMany(type => Board, board => board.user, {eager:true})
boards: Board[];
@ManyToOne(type => User, user => user.boards, {eager:false})
user: User;
POST 할 때 유저 정보 넣어주기
<user.entity.ts>
@OneToMany(type => Recipe, recipe => recipe.user, {eager:true})
recipes: Recipe[];
<recipe.entity.ts>
@ManyToOne(type => User, user => user.recipes, {eager:false})
user: User;
@OneToMany(type => Review, review => review.recipe, {eager:true})
reviews: Review[];
<review.entity.ts>
@ManyToOne(type => User, user => user.recipes, {eager:false})
user: User;
@ManyToOne(type => Recipe, recipe => recipe.reviews, {eager:false})
recipe: Recipe;
<get-user-decorator.ts>
import { ExecutionContext, createParamDecorator } from '@nestjs/common';
import { User } from './user.entity';
export const GetUser = createParamDecorator(
(data, ctx: ExecutionContext): User => {
const req = ctx.switchToHttp().getRequest();
return req.user;
},
);
<recipe.service.ts>
createRecipe(createRecipeDto: CreateRecipeDto, user: User): Promise<Recipe> {
return this.recipeRepository.createRecipe(createRecipeDto, user);
}
<recipe.controller.ts>
@Post('/insert')
@UsePipes(ValidationPipe)
createRecipe(
@Body() createRecipeDto: CreateRecipeDto,
@GetUser() user: User,
): Promise<Recipe> {
return this.recipeService.createRecipe(createRecipeDto, user);
}
<recipe.repository.ts>
import { DataSource, Repository } from 'typeorm';
import { Recipe } from './recipe.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { CreateRecipeDto } from './dto/create-recipe.dto';
import { User } from 'src/auth/user.entity';
export class RecipeRepository extends Repository<Recipe> {
constructor(@InjectRepository(Recipe) private dataSource: DataSource) {
super(Recipe, dataSource.manager);
}
async createRecipe(
createRecipeDto: CreateRecipeDto,
user: User,
): Promise<Recipe> {
const { recipeName, img, portion, leadTime, level, ingredient, step } = createRecipeDto;
const recipe = this.create({
recipeName,
img,
portion,
leadTime,
level,
ingredient,
step,
user,
});
await this.save(recipe);
return recipe;
}
}
+avestar는 등록할 때 필요 없어서 삭제
<review.service.ts>
createReview(createReviewDto: CreateReviewDto, user: User): Promise<Review> {
return this.reviewRepositoty.createReview(createReviewDto, user);
}
<review.controller.ts>
@Post('/insert')
@UsePipes(ValidationPipe)
createReview(
@Body() createReviewDto: CreateReviewDto,
@GetUser() user: User,
): Promise<Review> {
return this.reviewService.createReview(createReviewDto, user);
}
<review.repository.ts>
import { InjectRepository } from '@nestjs/typeorm';
import { Review } from './review.entity';
import { DataSource, Repository } from 'typeorm';
import { CreateReviewDto } from './dto/create-review.dto';
import { User } from 'src/auth/user.entity';
export class ReviewRepository extends Repository<Review> {
constructor(@InjectRepository(Review) private dataSource: DataSource) {
super(Review, dataSource.manager);
}
async createReview(
createReviewDto: CreateReviewDto,
user: User,
): Promise<Review> {
const { star, comment } = createReviewDto;
const review = this.create({ star, comment, user });
await this.save(review);
return review;
}
}
해당 유저의 레시피, 댓글 가져오기
<recipe.controller.ts>
@Get()
getUserAllRecipe(@GetUser() user: User): Promise<Recipe[]> {
return this.recipeService.getUserAllRecipe(user);
}
<recipe.service.ts>
async getUserAllRecipe(user: User): Promise<Recipe[]> {
const query = this.recipeRepository.createQueryBuilder('recipe');
query.where('recipe.userId = : userId', { userId: user.id });
const recipes = await query.getMany();
return recipes;
}
<review.controller.ts>
@Get()
getUserAllReview(@GetUser() user: User): Promise<Review[]> {
return this.reviewService.getUserAllReview(user);
}
<review.service.ts>
async getUserAllReview(user: User): Promise<Review[]> {
const query = this.reviewRepositoty.createQueryBuilder('review');
query.where('review.userId = : userId', { userId: user.id });
const reviews = await query.getMany();
return reviews;
}
자신이 생성한 레시피, 댓글 삭제
<recipe.controller.ts>
@Delete('/:recipeId')
deleteRecipe(
@Param('recipeId', ParseIntPipe) recipeId,
@GetUser() user: User,
): Promise<void> {
return this.recipeService.deleteRecipe(recipeId, user);
}
<recipe.service.ts>
async deleteReview(reviewId: number, user: User): Promise<void> {
const result = await this.reviewRepositoty.delete({
reviewId,
user: { id: user.id },
});
if (result.affected === 0) {
throw new NotFoundException(`Can't find Review with id ${reviewId}`);
}
}
<review.controller.ts>
@Delete('/:reviewId')
deleteReview(
@Param('reviewId', ParseIntPipe) reviewId,
@GetUser() user: User,
): Promise<void> {
return this.reviewService.deleteReview(reviewId, user);
}
<review.service.ts>
async deleteRecipe(recipeId: number, user: User): Promise<void> {
const result = await this.recipeRepository.delete({
recipeId,
user: { id: user.id },
});
if (result.affected === 0) {
throw new NotFoundException(`Can't find Recipe with id ${recipeId}`);
}
}
#엘리스트랙 #엘리스트랙후기 #리액트네이티브강좌 #온라인코딩부트캠프 #온라인코딩학원 #프론트엔드학원 #개발자국비지원 #개발자부트캠프 #국비지원부트캠프 #프론트엔드국비지원 #React #Styledcomponent #React Router Dom #Redux #Typescript #Javascript