Chapter 13無料公開

✅Infrastructureは外部サービスとのやりとりをカプセル化する

たった
たった
2021.06.25に更新
このチャプターの目次
アプリケーションコード
src
├── middleware     ... 認証・認可とGraphQLのコンテキスト
├── domain         ... ビジネスロジックの共通化
├── usecases       ... アプリケーションロジック
>├── infrastructure ... 外部サービスとのやりとり
├── entities       ... エンティティとGraphQLのフィールド
├── resolvers      ... GraphQLのリゾルバー
└── inversify.config.ts ... 依存性の注入(以下、DI)の設定

このチャプターで使用するライブラリ

  • InversifyJS

概要

昨今のWebアプリケーションは、外部サービスとの連携が一切ないという方が珍しいと思います。
このチャプターでは、具体的に外部サービスとのやりとりをどのように実装するかを解説します。

認証のチャプターでも使用した、Auth0を例に使って紹介します。

実装

Auth0はAPIクライアントを提供してくれているので、クライアントを注入して実装を行っていきます。

be/src/infrastructure/Auth0API.ts
import {
  ManagementClient,
  User,
  AppMetadata,
  UserMetadata,
} from 'auth0'
import { inject, injectable } from 'inversify'

@injectable()
export class Auth0API {
  constructor(
    @inject(ManagementClient)
    private readonly management: ManagementClient
  ) {}

  async findByIds(ids: string[]): Promise<User<AppMetadata, UserMetadata>[]> {
    return await this.management.getUsers({
      q: ids.map((id) => `user_id:${id}`).join(' OR '),
    })
  }

  async deleteUser(data: { id: string }): Promise<void> {
    return await this.management.deleteUser(data)
  }
}

このようにして使うことができます。
Auth0のようにAPIクライアントを提供していないエンドポイントには、apollo-datasource-restを組み合わせて使うと効率良くAPIを叩くことができます。