OpenAPI Generator + TypeScript

OpenApi generator là gì?
OpenAPI Generator là một nhánh của codegen swagger giữa các phiên bản 2.3.1 và 2.4.0. Rất nhiều bạn chỉ biết đến OpenAPI là 1 thư viện để viết tài liệu api cho phía backend. Những ngoài ra nó còn có thể tận dụng tài liệu OpenAPI phía backend (yaml file) để generate app client giúp cho việc call api phía client không có chút sai lệch nào so với backend. Điều này giúp cho việc chuẩn hóa giao tiếp giữa client vs server, việc giao tiếp 2 bên sẽ trở nên đơn giản, hiệu quả hơn.
OpenAPI được hỗ trợ tới hơn 50 client generators và hơn 40 ngôn ngữ khác nhau, điều này giúp cho nó khá dễ trong việc mở rộng. Để biết được nó sử dụng ở client như nào thì sau đây mình sẽ triển khai OpenAPI với vuejs nhé.

1. Cài đặt OpenAPI Generator CLI

npm install @ openapitools / openapi-generator-cli -g 
or
yarn add -D @openapitools/openapi-generator-cli

2. Generate client

openapi-generator generate -g typescript-axios -i ./path/to/openapi.yaml -o ./frontend-application-directory/src/types/typescript-axios

Source được tạo ra sẽ có cấu trúc thư mục như sau:

./types
├── client-axios
│   ├── api.ts
│   ├── base.ts
│   ├── configuration.ts
│   ├── git_push.sh
│   └── index.ts
└── index.d.ts

3. Áp dụng vào vuejs
Ở đây mình sẽ áp dụng vào màn hình login nhé.

3.1 Yaml file và app client vừa tạo
Sau đây là thông tin loginId và password có trong api.ts được dùng để login. Dưới đây là file yaml và api.ts vừa được generate.
openapi.yaml

  LoginRequest:
      tags:
        - Auth
      title: LoginRequest
      type: object
      description: Thông tin xác thực
      required: [loginId, password]
      operationId: postAuthLogin
      properties:
        loginId:
          type: string
          description: ID đăng nhập
        password:
          type: string
          description: Mật khẩu

types/typescript-client/api.ts

/**
 * 認証情報
 * @export
 * @interface LoginRequest
 */
export interface LoginRequest {
    /**
     * ID đăng nhập
     * @type {string}
     * @memberof Auth
     */
    loginId: string;
    /**
     * Mật khẩu
     * @type {string}
     * @memberof Auth
     */
    password: string;
}

export class AuthApi extends BaseAPI {
    public postAuthLogin(loginRequest: LoginRequest, options?: any) {
        return AuthApiFp(this.configuration).postAuthLogin(loginRequest, options).then((request) => request(this.axios, this.basePath));
    }
}

3.2. Sử dụng trong store(Vuex)
Ở đây mình sử dụng store để call api. File store của mình sẽ như sau:

import { Module, ActionTree, GetterTree, MutationTree } from 'vuex'
import { LoginRequest, AuthApi } from '@/types/typescript-axios'
import Cookies, { CookieSetOptions } from 'universal-cookie'
import { RootState } from '@/types/index'

interface AuthState {
}

interface LoginParams {
  basePath?: string,
  value: LoginRequest,
  cookie: Cookies,
  stage: string,
}

export const state = (): AuthState => ({
})

export const getters: GetterTree<AuthState, RootState> = {
}

export const mutations: MutationTree<AuthState> = {
}

export const actions: ActionTree<AuthState, RootState> = {
  async login(_ctx, params: LoginParams) {
    try {
      const { data } = await(new AuthApi({ basePath: params.basePath }))
        .postAuthLogin(params.value)
      params.cookie.set(
        'accessToken',
        data.accessToken,
        {
          secure: params.stage !== 'local',
          maxAge: data.expiresIn,
        } as CookieSetOptions,
      )
    } catch (error) {
      throw error.response
    }
  },
}

export const auth: Module<AuthState, RootState> = {
  namespaced: true,
  getters,
  mutations,
  actions,
}

Hy vọng bài viết của mình sẽ giúp các bạn có thể hiểu về OpenAPI hơn.
Chúc các bạn ngày càng phát triển bản thân hơn nhé!