Как реализовать несколько классов, чтобы сделать несколько обращений к бэкэнд-системам? - PullRequest
0 голосов
/ 10 октября 2018

Я реализовал шаблон, который должен сделать два вызова для различных API и объединить ответ, мне нужна помощь экспертов, если есть какой-либо лучший способ или лучший метод для достижения этой задачи.

В вызове getBalanceControllerоба API для получения ответов с помощью Axios, что было бы хорошим дизайном, чтобы следовать в сценарии ниже?просто хотел убедиться, что я не делаю ничего лишнего.

getBalanceController.ts

import {Controller,Body} from 'tsoa';
import {AdminHandler} from "./AdminHandler";
import {ClientHandler} from "./ClientHandler";

export class GetBalanceController extends Controller {
    public static async process(@Request() request: ExpressRequest,
        response: ExpressResponse): Promise < any > {
        try {
            const instance = new GetBalanceController();
            const data = await instance.execute(request, response);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    private _request: IRequestURL[] = [];
    constructor() {
        super();
    }

    private async execute(@Request() request: ExpressRequest, response: ExpressResponse): Promise < any > {
        buildResponses:any = [];
        try {
            const _adminData = await AdminHandler.process(request,response);
            const _clientData = await ClientHandler.process(request,response);
            buildResponses.Details.push(_adminData, _caremarkData);
        } catch (err) {
            return Promise.reject(err);
        }
        return buildResponses;
    }

}

adminHandler.ts

import {Controller,Body} from 'tsoa';

export class AdminHandler extends Controller {
    public static async process(@Request() request: any,
                                            response: any): Promise<any> {
        try {
            const instance = new AdminHandler();
            const data = await instance.execute(request);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    constructor() {
        super();
    }
    public async execute(@Body() _request: any): Promise<any> {
        let result: any;
        try {
            const url = "adminUrl;
            const requestKeys: string[] = Object.keys(_request);
            if (requestKeys.length !== 1 ||
                !(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
                throw new Error("Invalid request");
            }
            const response: any = await axios.post(url, _request);
            result = response.data;
        } catch (err) {
            return Promise.reject(err);
        }
        return Promise.resolve(result);
    }
    // there will be another method that will be called again from main controller to customize the response.
}

clientHandler.ts

import {Controller,Body} from 'tsoa';

export class ClientHandler extends Controller {
    public static async process(@Request() request: any,
                                            response: any): Promise<any> {
        try {
            const instance = new ClientHandler();
            const data = await instance.execute(request);
            response.status(200);
            response.send(data);
        } catch (err) {
            response.status(200);
            response.send(err.message);
        }

    }

    constructor() {
        super();
    }
    public async execute(@Body() _request: any): Promise<any> {
        let result: any;
        try {
            const url = "clientUrl;
            const requestKeys: string[] = Object.keys(_request);
            if (requestKeys.length !== 1 ||
                !(_request[requestKeys[0]].details && _request[requestKeys[0]].details.tokenId)) {
                throw new Error("Invalid request");
            }
            const response: any = await axios.post(url, _request);
            result = response.data;
        } catch (err) {
            return Promise.reject(err);
        }
        return Promise.resolve(result);
    }

    // there will be another method that will be called again from main controller to customize the response.
}
...