【OpenAPI】Railsのコードを自動生成してみた

# はじめに

`OpenAPI`を使用したRailsコードの自動生成を行いました。
以下のことを行ったので備忘録も兼ねてまとめます。

* OpenAPIドキュメントを作成・環境構築
* OpenAPIドキュメントからRuby on Rails のソースコードを生成（`OpenAPI generator`）
* Rails用のテンプレートの追加（`OpenAPI generator`）

実行結果は以下の GitHubにあげてます。

https://github.com/YujirouSakoda/OpenAPI-rails


# OpenAPIドキュメントを作成・環境構築
### ① `OpenAPI-rails`フォルダを作成
※以降の作業は`OpenAPI-rails`フォルダ下で行います。
```console:console
mkdir OpenAPI-rails
```

### ② OpenAPIドキュメントを作成（`openapi.yaml`）
```console:console
type nul > openapi.yaml
```
ファイルの中身は[Swagger EditorのWeb版](https://editor.swagger.io/)から取得します。

### ③ Dockerで環境構築
`Dockerfile`と`docker-compose.yml`を以下の内容で配置してください。

```Dockerfile:Dockerfile

# ReDocCLI公式のDockerfileを使用
# https://github.com/Redocly/redoc/blob/master/cli/Dockerfile

FROM node:alpine

RUN npm install -g redoc-cli

WORKDIR /data
EXPOSE 8080

ENTRYPOINT ["redoc-cli"]
CMD []
```

```docker-compose.yml
version: '3.8'
services:
  swagger-ui:
    image: swaggerapi/swagger-ui
    ports:
      - 8011:8080
    volumes:
      - ./openapi.yaml:/usr/share/nginx/html/openapi.yaml
    environment:
      API_URL: openapi.yaml
  redoc:
    image: redocly/redoc
    ports:
      - 8012:80
    volumes:
      - ./openapi.yaml:/usr/share/nginx/html/openapi.yaml
    environment:
      SPEC_URL: openapi.yaml
  redoc-cli:
    build: .
    volumes:
      - ./openapi:/data
```

### ④ dockerイメージをbuild＆UP 

```console:console
# dockerイメージをbuild
docker-compose build

# dockerイメージをup
docker-compose up -d

```

### ⑤ `localhost:8011` or `localhost:8012`で確認

以下のように表示されれば成功です。

`localhost:8011`：**Swagger**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630572/82d77414-8d07-377c-82b1-fd4e7ab8046c.png)


`localhost:8012`：**Redoc**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630572/0cf890aa-5a0d-47d4-215f-b600b0a33594.png)



# OpenAPIドキュメントからRuby on Rails のソースコードを生成（`OpenAPI generator`）


※`OpenAPI generator`を使用する場合、JVMが必要だったので[Java 17](https://www.oracle.com/java/technologies/downloads/#jdk17-windows)をインストールしてます。

### ①npmでopenapi-generatorをインストール
```console:console
npm install @openapitools/openapi-generator-cli
```

### ②rails_codesフォルダを作成
このフォルダ下にRailsコードを自動生成していきます。
```console:console
mkdir rails_codes
```

### ③以下のコマンドでRailsコードを自動生成

```console:console
openapi-generator-cli generate -g ruby-on-rails -i openapi.yaml -o ./rails_codes
```
`-g` : 生成するコードの種類を指定（[ジェネレータ一覧](https://openapi-generator.tech/docs/generators)）
`-i` : yamlファイル/xmlファイルのOpenAPIドキュメント
`-o` : 自動生成されるコードの出力先を指定

### ④Railsコードの自動生成を確認

以下のようなメッセージが出て、
```console:console
################################################################################
# Thanks for using OpenAPI Generator.                                          #
# Please consider donation to help us maintain this project ?                 #
# https://opencollective.com/openapi_generator/donate                          #
################################################################################
```

rails_codes下にRailsコードが生成されてたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2630572/2df69003-5b28-6db3-f2f9-4c1ea6cf7618.png)


**※実際に生成されたコードは下記であげてます。**

https://github.com/YujirouSakoda/OpenAPI-rails/tree/main/rails_codes

# Rails用のテンプレートの追加（OpenAPI generator）

自動生成されるコードはテンプレートを設置して、
適応したいテンプレートを指定することで生成コードをカスタマイズできます。

### ①rails用のテンプレートを取ってくる

[公開されてるGitHub](https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator/src/main/resources/ruby-on-rails-server)から`ruby-on-rails-server`フォルダを取得してきて、
`OpenAPI-rails`フォルダ下に配置します。

### ②テンプレートを指定してコード生成コマンドを実施

```console:console
openapi-generator-cli generate -g ruby-on-rails -i openapi.yaml -o ./rails_codes -t ruby-on-rails-server
```

`-t` : 使用するテンプレートを指定

`ruby-on-rails-server`フォルダに何も手を加えていない場合は、
デフォルトの時と同じコードが生成されます。
テンプレートをカスタマイズして生成コードが変わることを確認してみてください。

# まとめ
今回OpenAPIを使用したRailsコードの自動生成の手順を備忘録も兼ねて書きました。
テンプレートのカスタマイズの部分は正直自分も理解がまだ足りてない部分があるので、
何か分かったら追加で記事を書こうと思います:ramen:

# 参考

* [Swagger EditorのWeb版](https://editor.swagger.io/)
* [公式GitHubのREADME](https://github.com/OpenAPITools/openapi-generator)
* [openapi-generatorリファレンス](https://openapi-generator.tech/)