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
import { IsNotEmpty, IsNumber, IsString } from "class-validator";
export class RequestUpdate {
@IsNumber()
@IsNotEmpty()
readonly qty: number;
}
再注文すると、数量の変数の変更しか許可されません.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に渡します.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というファイルを作成します.
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;
}
import { IsNumber, IsString } from 'class-validator';
import { ResponseOrder } from 'src/vo/response.order';
export class UserDto {
...
orders: ResponseOrder[];
}
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
#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はまだ成熟していないので、上記の機能を実現することができますが、私はまだ実現していないかもしれませんので、上記の機能をさらに勉強して、文章を書きます.ありがとうございます.
Reference
この問題について(E-commerce Application(Nest js Microservice) - 10. Order-serviceとcatalog-service通信(3)), 我々は、より多くの情報をここで見つけました https://velog.io/@biuea/E-commerce-ApplicationNest-js-Microservice-10.-order-service와-catalog-service-통신3テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol