sparcs-kaist / otlplus-server

OTL Plus의 NestJS 마이그레이션입니다.
https://otl.kaist.ac.kr
5 stars 0 forks source link

setup-Swagger #125

Open useruseruse opened 2 months ago

useruseruse commented 2 months ago

플러그인을 활성화하면 플러그인이 등록된 파일 접미사로 컨트롤러나 DTO, 엔티티를 식별하여 Abstract Syntax Tree를 기반으로 적절한 데코레이터를 추가합니다. 플러그인은 다음과 같은 문서화 정보들을 자동으로 추가합니다.

참고

image

TODO

LarryKwon commented 2 months ago

이거 근데 방금 봤는데, response 타입이 달려있어도 안 뜨는거 같은데, 혹시 Promise로 감싸져있으면 안 잡히는건가? image image

useruseruse commented 2 months ago

Aㅏ 제가 방금 확인해봤는데 typescript interface 나 type 로 정의된 DTO 타입들은 런타임에 존재하지 않아서 인식이 안되고, class 로 바꾸면 인식이 되네요. interface DTO 를 쓰는 파람들도 다 인식이 안되고요. ts plugin 에서 그런 것들을 수행해주는 줄 알았는데.. 아닌가봐요

관련이슈들 1 2 3

대애충 해결방법은 아래 정도 인거 같은데 좀 더 찾아봐야 할 거 같아요ㅜ 1) class 로 일일이 다 바꾸거나 2) typescript interface 에서 class 로 바꿔주는 외부 라이브러리?를 쓰거나

LarryKwon commented 2 months ago

클래스로 바꾸는 건 못할 거 같은데... 지금 동엽님이 한 작업이 클래스를 인터페이스로 바꾼 작업을 다 한 거라.. 타입 체크할 때는 가벼운 인터페이스 쓰기도 하고,prisma에서 선택해온 결과(select)가 타입 alias로 되어있어서 그거랑 유연하게 맞추려고 인터페이스로한 것도 있어서...

LarryKwon commented 2 months ago

https://chatgpt.com/share/d49c51c4-abad-485d-a8b1-4065a2a4c983

이거 참고

useruseruse commented 2 months ago

오 제공해주신 gpt 문서 읽어봤는데 ts-morph라는 라이브러리가 compile time 에 Typescript AST 분석해서 interface DTO들에 적절한 데코레이터 달아주는 내용 같네요. 근데 스웨거에서 인식을 못하는 게 런타임에 interface 로 정의된 DTO들이 사라져서 그런거고 @ApiResponse 데코레이터들도 class 에만 달 수 있는 걸로 알고 있어요

useruseruse commented 2 months ago

대신에 tsoa 라는 라이브러리를 쓰면 typescript api interface 도 스웨거에서 볼 수 있는 것 같은데, get, query 같은 nest 데코레이터들을 싹다 tsoa 에서 import 하게 바꿔야 하는 것 같아서 좋은 방법은 아닌 것 같다는 생각이 드네요. 2 1

image
useruseruse commented 2 months ago

스웨거를 안달고 type 말아서 패키지로 배포한다고 해도 controller method return 타입을 달아주는 건 필요해보이는 것 같아서, 프론트에서 마이그레이션 하는 페이지부터 return type 달아주고, swagger 는 일단 더 알아보는 것 어떨까요?

LarryKwon commented 2 months ago

API Response에 타입 다 달아놨습니다. @useruseruse

다음은 작업 시에 참고할 점입니다.

useruseruse commented 4 weeks ago

@LarryKwon common/api-docs/type.ts 폴더가 아웃풋이고 ts-node src/common/api-docs/docs-generator.ts요렇게 실행하면 types.ts 폴더 만들 수 있습니다. 다른 feature controller 중에 메쏘드이름이 겹치는게 있어서, (getLectures) 프론트엔드에서 검색하기 편하도록 하려면 1) controller method 네임을 다같이 변경하거나 아니면 namespace 만들때 HttpMethod + 컨트롤러 메쏘드 명 이런식으로 변경하면 될 거 같습니다. 2) 타입이 없는 경우에는 일단 never 타입으로 했습니다. 리뷰 부탁드려요오