Order.entity// Order-item.entity

김종민·2022년 7월 5일
0

Nuber-Server

목록 보기
26/34

들어가기
첫번쨰로, $nest g mo orders
order Entity는 제법, 매우 복잡하다.
집중해서 집중해서 봐야할것.
order.entity.ts와 order-item.entity.ts두개로 한다.

$nest g mo orders

1. orders/entities/order-item.entity.ts

import { Field, InputType, Int, ObjectType } from '@nestjs/graphql';
import { CoreEntity } from 'src/common/entities/core.entity';
import { Dish } from 'src/restaurant/entities/dish.entity';
import { Column, Entity, ManyToOne } from 'typeorm';

@InputType('OrderItemOptionInputType', { isAbstract: true })
@ObjectType()
export class OrderItemOption {
  @Field(() => String)
  name: string;

  @Field(() => String, { nullable: true })
  choice?: string;

  @Field(() => Int, { nullable: true })
  extra?: number;
}

@InputType('OrderItemInputType', { isAbstract: true })
@ObjectType()
@Entity()
export class OrderItem extends CoreEntity {
  @Field(() => Dish)
  @ManyToOne(() => Dish, { nullable: true, onDelete: 'CASCADE' })
  dish: Dish;
  ///OrderItem은 Dish를 Type으로 하고,
  ///OrderItemOption배열로 options를 받는다.

  @Field(() => [OrderItemOption], { nullable: true })
  @Column({ type: 'json', nullable: true })
  options?: OrderItemOption[];
}

******************************order.entity.ts의 아래의 field와 연결됨.
  @Field(() => [OrderItem])
  @ManyToMany(() => OrderItem) ///많은 items들은 많은 OrderItem은 가져서
                               ///ManyToMany로 해줌. 
                               ///ManyToMany에는 자동적으로
                               ///JoinTable가 따라온다.
  @JoinTable()
  items: OrderItem[];
*****************************************

2. orders/entities/order.entity.ts

import {
  Field,
  Float,
  InputType,
  ObjectType,
  registerEnumType,
} from '@nestjs/graphql';
import { IsEnum } from 'class-validator';
import { CoreEntity } from 'src/common/entities/core.entity';
import { Restaurant } from 'src/restaurant/entities/restaurant.entity';
import { User } from 'src/users/entities/user.entity';
import { Column, Entity, JoinTable, ManyToOne } from 'typeorm';
import { OrderItem } from './order-item.entity';

export enum OrderStatus {
  Pending = 'Pending',
  Cooking = 'Cooking',
  PickedUp = 'PickedUp',
  Deliverd = 'Deliverd',
}

registerEnumType(OrderStatus, { name: 'OrderStatus' });

@InputType('OrderInputType', { isAbstract: true })
@ObjectType()
@Entity()
export class Order extends CoreEntity {
  @Field(() => User, { nullable: true })
  @ManyToOne(() => User, (user) => user.orders, {
    onDelete: 'SET NULL',
    nullable: true,
  })
  customer?: User;

  @Field(() => User, { nullable: true })
  @ManyToOne(() => User, (user) => user.rides, {
    onDelete: 'SET NULL',
    nullable: true,
  })
  driver?: User;

  @Field(() => Restaurant, { nullable: true })
  @ManyToOne(() => Restaurant, (restaurant) => restaurant.orders, {
    onDelete: 'SET NULL',
    nullable: true,
  })
  restaurant: Restaurant;

  @Field(() => [OrderItem])
  @ManyToMany(() => OrderItem)
  @JoinTable()
  items: OrderItem[];

  @Column({ nullable: true })
  @Field(() => Float, { nullable: true })
  total?: number;

  @Column({ type: 'enum', enum: OrderStatus, default: OrderStatus.Pending })
  @Field(() => OrderStatus)
  @IsEnum(OrderStatus)
  status: OrderStatus;
}

user.entity.ts

  @Field(() => [Order])
  @OneToMany(() => Order, (order) => order.customer)
  orders: Order[];

  @Field(() => [Order])
  @OneToMany(() => Order, (order) => order.driver)
  rides: Order[];

restaurant.entity.ts

  @OneToMany(() => Order, (order) => order.restaurant)
  orders: Order[];

Order에서
1. Customer 고객이 들어가고,
2. Restaurant가 들어가고,
3. status 주문상태로 enum으로 만들어준다.
4. total 총 내야 할 금액이 들어가고
5. driver Order를 받아서 배달을 할 driver가 들어가고
6. items OrderItem의 배열이 들어간다.
@ 6-1. OrderItem은 OrderItem Entity로 따로 만든다.
@ 6-2. OrderItem Entity는 dish:Dish와 options: OrderItemOption[]으로 구성된다.
@ 6-3. OrderItemOption은 export class OrderItemOption[]으로 만든다.
@ 6-4. OrderItemOption은 name, choice, extra로 구성된다.

포테이토피자(
{맛: spiceA(extra:5), spiceB(extra:5), spiceC(extra:5)},
{size: XL(extra:15), L(extra:25), SM(extra:45)}
{pickle}
)
포테이토 피자는 Dish,
맛,size,Pickle은 OrderItemOption의 name,
spiceA, spiceB, XL, L, SM등등은 choice
extra는 extra.

OrderItemOption은 (name, choice, extra)는 type이 string, string, number인데
이것은 json으로 받아서, DishOption에서 같은 단어를 찾아서 Order에 적용시켜준다.

profile
코딩하는초딩쌤

0개의 댓글