본문 바로가기

프로젝트 개발

23.12.22 (관계 설정 후 활용)

유저(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