E-commerce Application(Nest js Microservice) - 10. Order-serviceとcatalog-service通信(3)

7043 ワード

#1エラー・ケース


この文章では、以下のケースについて議論します.
1)ERROR ORDER再注文要求
1)ユーザのUI画面が存在する場合、注文はERRORとなり、ユーザにメッセージが送信される.では、ユーザーは注文をキャンセルしたり、数量を変更したりしてから注文する必要があります.ここには二つの状況がある.これらのケースを次のように分類します.
1-1)注文をキャンセルした場合は、/orders/:orderId/キャンセル要求
1-2)再注文の場合は、/orders/:orderId/reorderリクエストを押してください.この場合、既存のreOrderメソッドを変更します.

#21)エンクロージャ


1-1)については、以前に作成したキャンセル注文を置き換えることができます.
1-2)再注文要求は/orders/:orderId/reorder
  • request.update.ts
  • import { IsNotEmpty, IsNumber, IsString } from "class-validator";
    
    export class RequestUpdate {
        @IsNumber()
        @IsNotEmpty()
        readonly qty: number;
    }
    再注文すると、数量の変数の変更しか許可されません.
  • order.controller.ts
  • import { Body, Controller, Get, Param, Patch, Post } from '@nestjs/common';
    import { EventPattern } from '@nestjs/microservices';
    import { OrderDto } from 'src/dto/order.dto';
    import { RequestCreate } from 'src/vo/request.create';
    import { RequestUpdate } from 'src/vo/request.update';
    import { ResponseOrder } from 'src/vo/response.order';
    import { OrderService } from './order.service';
    
    @Controller('orders')
    export class OrderController {
        constructor(private readonly orderService: OrderService,) {}
        ...
    
        @Post(':orderId/reorder')
        public async reOrder(
            @Param('orderId') orderId: string,
            @Body() requestUpdate: RequestUpdate    
        ) {
            const orderDto = new OrderDto();
    
            orderDto.orderId = orderId;
            orderDto.qty = requestUpdate.qty;
    
            return await this.orderService.reOrder(orderDto);
        }
    
        ...
    以下に示すように、要求された情報値を含むコントローラのreOrderメソッドをOrderDtoに渡します.
  • order.service.ts
  • import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
    import { ClientProxy } from '@nestjs/microservices';
    import { InjectRepository } from '@nestjs/typeorm';
    import { OrderDto } from 'src/dto/order.dto';
    import { OrderEntity } from 'src/entity/order.entity';
    import { ResponseOrder } from 'src/vo/response.order';
    import { Repository } from 'typeorm';
    import { v4 as uuid } from 'uuid';
    
    @Injectable()
    export class OrderService {
        constructor(
            @InjectRepository(OrderEntity) private orderRepository: Repository<OrderEntity>,
            @Inject('order-service') private readonly client: ClientProxy    
        ) {}
    
        ...
    
        public async reOrder(orderDto: OrderDto): Promise<ResponseOrder> {
            try {
                const orderEntity = await this.orderRepository.findOne({ where: { orderId: orderDto.orderId }});
                const responseOrder = new ResponseOrder();
                
                orderEntity.qty = orderDto.qty;
                orderEntity.totalPrice = (Number(orderEntity.qty) * Number(orderEntity.unitPrice));
                orderEntity.status = 'RE_ORDER';
    
                this.client.emit("RE_ORDER", orderEntity);
                
                await this.orderRepository.save(orderEntity);
    
                responseOrder.orderId = orderEntity.orderId;
                responseOrder.status = orderEntity.status;
    
                return responseOrder;
            } catch(err) {
                throw new HttpException(err, HttpStatus.BAD_REQUEST);
            }
        }
    
        ...
    }
    これにより、サービス内のビジネスロジックに次の変更が発生します.数が変わったのでorderEntity.qtyの数を変更する必要があります.orderEntity.TotalPriceも変わりますReOrderのコードを変更します

    #3 auth-service(後でアップロード)


    次に、ユーザー情報を表示した後、orderに関する情報をロードするためのコードを作成します.user-service.voディレクトリにResponseOrderというファイルを作成します.
  • response.order.ts
  • import { IsBoolean, IsNotEmpty, IsNumber, IsString } from "class-validator";
    
    export class ResponseOrder {
        @IsString()
        orderId: string;
        
        @IsString()
        productId: string;
        
        @IsString()
        productName: string;
        
        @IsNumber()
        qty: number;
        
        @IsNumber()
        unitPrice: number;
        
        @IsNumber()
        totalPrice: number;
        
        @IsString()
        userId: string;
    
        @IsBoolean()
        status: string;
    }
  • user.dto.ts
  • import { IsNumber, IsString } from 'class-validator';
    import { ResponseOrder } from 'src/vo/response.order';
    
    export class UserDto {
        ...
    
        orders: ResponseOrder[];
    }
  • response.user.ts
  • import { ResponseOrder } from "./response.order";
    
    export class ResponseUser {
        email: string;
        nickname: string;
        encryptedPwd: string;
        userId: string;
        orders: ResponseOrder[];
    }
    そしてResponseUserにResponseOrder Arrayを追加これらvoは,ユーザ情報を返す際に必要なvoクラスである.
    npm install --save nest-feign nest-consul-loadbalance nest-consul consul
  • Nestcloud/faignはずっと連動していますが、効果があまりよくないので、ドキュメントを探してアップロードします.
  • #4 test


    すべてのコードがほぼ完了しているようです.次に、いくつかのシナリオを構成し、テストします.
    1)会員加入後、Product-001の製品を10個注文する
    2)Product-001の製品をキャンセルする
    3)キャンセルしたproduct-001の製品を20個再注文に変更
    4)Product-002の300製品を注文する
    5)ERROR ORDERステータス値Product-002の10個のオーダーを再発注
    本案に基づいてテストを行います.
    1)会員加入後、Product-001の製品を10個注文する




    2)Product-001の製品をキャンセルする



    3)キャンセルしたproduct-001の製品を20個再注文に変更


    4)Product-002の300製品を注文する


    5)ERROR ORDERステータス値Product-002の10個のオーダーを再発注


    すべてのシナリオが正常に動作します.そこで,実際のサービスのすべてのコードを実装した.
    Spring Cloudベースの別の一連のMicroServiceは、APIゲートウェイサービスを使用して、すべての要求を1つのポートとして各サービスに送信するか、Spring Securityを使用してインタフェースを実装します.
    NestJSはまだ成熟していないので、上記の機能を実現することができますが、私はまだ実現していないかもしれませんので、上記の機能をさらに勉強して、文章を書きます.ありがとうございます.