npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

node-msa-openapi-tatum

v0.4.0

Published

## 개요 - NodeJS 서버로 이루어진 MSA 환경에서 계층적으로 생성되는 OpenAPI 문서들을 통합하고 이를 사용자에게 제공하기 위한 모듈

Downloads

14

Readme

NODE-MSA-OPENAPI-TATUM

개요

  • NodeJS 서버로 이루어진 MSA 환경에서 계층적으로 생성되는 OpenAPI 문서들을 통합하고 이를 사용자에게 제공하기 위한 모듈

모듈 구성

ApiScanner

  • 해당 서버의 API 구성을 OpenAPI를 명세를 이용하여 스캔

ApiIntegrator

  • 해당 서버 이하의 마이크로서비스들에 대한 API 문서 통합을 설정한 디렉터리에서 수행

ApiFileAgent

  • Api 파일 관련 I/O 수행

Decorator

  • 기존 nestjs/swagger의 ApiSecurity 데코레이터의 비효율을 해결
    // user.controller.ts
    @Controller('user')
    export class UserController {
      @ApiSecurity('securityCategory',["requirement"])
      @UseGuards(MyGuard)
      @Get(':id')
      getUser(@Param('id') userId: string) {
        return this.userService(userId);
      }
    }
  • 사용 가드의 바인딩과 해당 가드의 정보가 각각 관리되는 구조 (ApiSecurity 데코레이터에 리터럴 형식으로 입력)
  • 이를 위해 NestJS 가드 클래스에 데코레이터를 하나 추가하면, 이후 해당 가드를 컨트롤러에 바인딩할 때 자동으로 가드의 정보가 OpenApi 문서에 추가

ConfigParser

  • 설정 파일을 읽어온 뒤 검증 후 반환

사용

의존성 추가

npm i node-msa-openapi-tatum

Write Config file (.js|.json)

  • [config].js

    module.exports = {
      outDir: string; // openAPI 문서를 내보낼 상대 경로 입력 ex "./doc"
      microservices: {
        [microserviceName: string]: { // 서비스들의 이름 ex "gateway", "user"
          appModuleName: string; // NestJS 인스턴스 생성을 위한 루트 모듈 클래스명 ex "AppModule"
          appModulePath: string; // 프로젝트 루트 경로를 기준으로 해당 서비스의 tsc 빌드된 루트 모듈의 상대 경로 ex "./dist/microservice/user/src/app.module"
          globalPrefix: string; // 해당 서비스에 설정된 전역 Api prefix ex. "api"
          isGateway: boolean; // 해당 서비스의 게이트웨이 여부
          openApi: {
            title: string; // openAPI 문서에 명시할 title
            description: string; // openAPI 문서에 명시할 description
            version: string; // openAPI 문서에 명시할 version
            tags: TagObject[]; // openAPI 문서에 명시할 tags
          };
        };
      };
    };
  • [config].json

    {
      "outDir": string; // openAPI 문서를 내보낼 상대 경로 입력 ex "./doc"
      "microservices": {
        [microserviceName: string]: { // 서비스들의 이름 ex "gateway", "user"
          "appModuleName": string; // NestJS 인스턴스 생성을 위한 루트 모듈 클래스명 ex "AppModule"
          "appModulePath": string; // 프로젝트 루트 경로를 기준으로 해당 서비스의 tsc 빌드된 루트 모듈의 상대 경로 ex "./dist/microservice/user/src/app.module"
          "globalPrefix": string; // 해당 서비스에 설정된 전역 Api prefix ex. "api"
          "isGateway": boolean; // 해당 서비스의 게이트웨이 여부
          "openApi": {
            "title": string; // openAPI 문서에 명시할 title
            "description": string; // openAPI 문서에 명시할 description
            "version": string; // openAPI 문서에 명시할 version
            "tags": TagObject[]; // openAPI 문서에 명시할 tags
          };
        };
      };
    };

Using GuardDecorator

  • user.guard.ts
    import { CanActivate, ExecutionContext } from '@nestjs/common';
    import { ApiDecoratorForGuard } from 'node-msa-openapi-tatum';
    import { Observable } from 'rxjs';
    
    @ApiDecoratorForGuard('security 종류(ex.bearer)', ['이게 필요해요.'])
    export class TestGuard implements CanActivate {
      canActivate(
        context: ExecutionContext,
      ): boolean | Promise<boolean> | Observable<boolean> {
        return true;
      }
    }
    
    @ApiDecoratorForGuard('test', ['accessToken', 'refreshToken'])
    export class TestGuard2 implements CanActivate {
      canActivate(
        context: ExecutionContext,
      ): boolean | Promise<boolean> | Observable<boolean> {
        return true;
      }
    }
  • user.controller.ts
    import { Body, Controller, Get, Param, Post } from '@nestjs/common';
    import axios from 'axios';
    import { UseGuardsForOpenApi } from 'node-msa-openapi-tatum';
    import { TestGuard, TestGuard2 } from 'src/app.guard';
    import { CreateUserDto } from './dto/createUserDto';
    
    @Controller('user')
    export class UserController {
      // @ApiSecurity('security 종류(ex.bearer)', ['이게 필요해요.'])
      // @ApiSecurity('test', ['testtest'])
      // @UseGuards(TestGuard,TestGuard2)
      // 원래는 위와 같이 비효율적인 구조로 데코레이터를 추가해야 했으나 해당 패키지에서는 아래 하나의 데코레이터로 위 로직 추가 가능
      @UseGuardsForOpenApi(TestGuard, TestGuard2)
      @Get(':id')
      async getUserInfo(@Param('id') userId: string) {
        const result = await axios
          .get<{ id: string; email: string }>(
            `http://user_service:3001/user/${userId}`,
          )
          .then((res) => res.data)
          .catch(() => ({ id: '실패', email: '실패' }));
        return result;
      }
    }

빌드 시 API 문서 생성

// tsc 실행 후 서버 로직 진입점이 dist/src/main.js에 존재할 경우
npx tatum-openapi scan .[config].js

생성된 OpenAPI 문서 통합

// tsc 실행 후 서버 로직 진입점이 dist/src/main.js에 존재할 경우
npx tatum-openapi integrate .[config].js

License

MIT