TypeScript 실습

박재민·2024년 3월 6일
1

TIL

목록 보기
41/49

별다방 프로그램 만들기


- 프로그램 기능

  • 음료 등록 기능 - 어드민
  • 음료 삭제 기능 - 어드민
  • 음료 조회 기능 - 어드민, 고객
  • 음료 주문 기능 - 고객
  • 음료 준비 완료 기능 - 어드민
  • 음료 수령 기능 - 고객


- 인터페이스 정의

// 유저
interface User {
  id: number;
  name: string;
  role: 'admin' | 'customer';
}
// 음료
interface Beverage {
  name: string;
  price: number;
}
// 주문
interface Order {
  orderId: number;
  customerId: number;
  customerName: string;
  beverageName: string;
  status: "placed" | "completed" | "picked-up";
}
// 음료 및 주문 데이터 정의
let beverages: Beverage[] = [];
let orders: Order[] = [];


- 함수 구현

권한 체크

// 어드민 권한
function isAdmin(user: User): boolean {
  return user.role === "admin";
}
// 고객 권한
function isCustomer(user: User): boolean {
  return user.role === "customer";
}

음료 등록,삭제,조회

// 음료 등록 기능

function addBeverage(user: User, name: string, price: number): void {
  if (!isAdmin(user)) {
    console.log("권한이 없습니다.");
    return;
  }

  const newBeverage: Beverage = { name, price };
  beverages.push(newBeverage);
}
// 음료 삭제 기능

function removeBeverage(user: User, beverageName: string): void {
  if (!isAdmin(user)) {
    console.log("권한이 없습니다.");
    return;
  }

  beverages = beverages.filter((beverage) => beverage.name !== beverageName);
}
// 음료 조회
function getBeverages(user: User): Beverage[] {
  if (!user) {
    return [];
  }
  return beverages;
}

음료 찾기 기능

// 음료 찾기
function findBeverage(beverageName: string): Beverage | undefined {
  return beverages.find((beverage) => beverage.name === beverageName);
}

주문 기능

function placeOrder(user: User, beverageName: string): number {
  if (!isCustomer(user)) {
    console.log("권한이 없습니다.");
    return -1;
  }

  const beverage = findBeverage(beverageName);
  if (!beverage) {
    console.log("해당 음료를 찾을 수 없습니다.");
    return -1;
  }

  const newOrder: Order = {
    orderId: orders.length + 1,
    customerId: user.id,
    customerName: user.name,
    beverageName,
    status: "placed",
  };
  orders.push(newOrder);
  return newOrder.orderId;
}

준비 완료

function completeOrder(user: User, orderId: number): void {
  if (!isAdmin(user)) {
    console.log("권한이 없습니다.");
    return;
  }

  const order = orders.find((order) => order.orderId === orderId);
  if (order) {
    order.status = "completed"; // 단순히 주문의 상태만 바꾸고 끝!
    console.log(
      `[고객 메시지] ${order.customerName}님, 주문하신 ${order.beverageName} 1잔 나왔습니다.`
    );
  }
}

수령 기능

function pickUpOrder(user: User, orderId: number): void {
  if (!isCustomer(user)) {
    console.log("권한이 없습니다.");
    return;
  }

  const order = orders.find(
    (order) => order.orderId === orderId && order.customerId === user.id
  );
  if (order && order.status === "completed") {
    order.status = "picked-up";
    console.log(
      `[어드민 메시지] 고객 ID[${order.customerId}]님이 주문 ID[${orderId}]을 수령했습니다.`
    );
  }
}

0개의 댓글