Edit Order

김종민·2022년 7월 7일
0

Nuber-Server

목록 보기
29/34

들어가기
Order status를 Cooking, Cooked, 등등의
상태로 바꾸는것.
owner가 Cooking, Cooked로 바꿀 수 있고,
driver가 PickedUp, Deliverd등으로 바꿀 수 있다.

1. dto

import { InputType, ObjectType, PickType } from '@nestjs/graphql';
import { MutationOutput } from 'src/common/dtos/output.dto';
import { Order } from '../entities/order.entity';

@InputType()
export class EditOrderInput extends PickType(Order, ['id', 'status']) {}
///Order의 id와 Status만 입력한다~

@ObjectType()
export class EditOrderOutput extends MutationOutput {}

2. Resolver

  @Mutation(() => EditOrderOutput)
  @Role(['Any'])
  async editOrder(
    @AuthUser() user: User,
    @Args('input') editOrderInput: EditOrderInput,
  ): Promise<EditOrderOutput> {
    return this.ordersService.editOrder(user, editOrderInput);
  }

3. service

  async editOrder(
    user: User,
    { id: orderId, status }: EditOrderInput,
  ): Promise<EditOrderOutput> {
    try {
      const order = await this.orders.findOne(orderId, {
        relations: ['restaurant'],
      });
      ///입력받은 id로 order를 찾는다.
      ///restaurant를 relation으로 불러준다.
      ///'restaurant'는 order.entity.ts에 @ManyToOne으로 있음.
      
      if (!order) {
        return {
          ok: false,
          error: 'Order not found',
        };
      }
      ///order 못찾으면 ok: false
      
      if (!this.canSeeOrder(user, order)) {
        return {
          ok: false,
          error: 'Can not see this',
        };
      }
      ///canSeeOrder이 false이면, return{ok: fasle~}로
      ///stop시킴!!
      
      let canEdit = true;
      ///canEdit를 let으로 설정시켜놔서
      ///!canEdit이면 return{ok:false}로 stop시킴.
      
      if (user.role === UserRole.Client) {
        canEdit = false;
      }
      ///user가 Clinet이면, 바로 false, client가 order를 edit할 일은 없음.
      
      if (user.role === UserRole.Owner) {
        if (status !== OrderStatus.Cooking && status !== OrderStatus.Cooked) {
          canEdit = false;
        }
      }
      ///Owner는 status가 Cooking, Cooked가 아닐떄는, canEdit할 수 없음.
      
      if (user.role === UserRole.Delivery) {
        if (
          status !== OrderStatus.PickedUp &&
          status !== OrderStatus.Deliverd
        ) {
          canEdit = false;
        }
      }
      ///Delivery도 위와 마찬가지
      
      if (!canEdit) {
        return {
          ok: false,
          error: 'You Can not do that',
        };
      }
      ///canEdit가 false이면 여기서 stop.
      
      await this.orders.save([
        {
          id: orderId,
          status,
        },
      ]);
      return {
        ok: true,
      };
      ///orders에  입력받은 id:orderId에 입력받은 status를 save(update)함. 
      
    } catch {
      return {
        ok: false,
        error: 'Could not edit order',
      };
    }
  }

EditOrder는 Defensive Programing부분이 햇갈릴 수 가 있음.
집중해서 check할 것!!

profile
코딩하는초딩쌤

0개의 댓글