Nestjs / Swagger: как документировать полезную нагрузку JWT? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть метод контроллера login(), который может возвращать либо 200 OK с токеном JWT, снабженным Session полезной нагрузкой, либо 451 Unavailable due to legal reasons с токеном JWT, снабженным полезной нагрузкой AcceptTerms, если пользователь, пытающийся войти в систему, должен согласиться с новой версиейусловий и положений.

@Nest.Post("login")
@ApiOperation({ title: 'Log in the user given email and password',  operationId: 'userLogin'})
@Nest.UseFilters(UnavailableLegalReasonsExceptionFilter)
@ApiResponse({ status: HttpStatus.OK, description: "User was properly logged in", type: JwtToken})
@ApiResponse({ status: 451, description: "User haven't confirmed the latest version of Terms & Conditions", type: JwtToken})
async login(@Nest.Body() body: DTOs.LoginDto): Promise<JwtToken> {
    ...
}

Теперь я хотел бы задокументировать это с помощью Swagger.JwtToken определяется как:

export class JwtToken {
    @ApiModelProperty({enum: TOKEN})
    type: TOKEN;

    @ApiModelProperty({description: "Number of seconds"})
    expiresIn: number;

    @ApiModelProperty({ description: "Token", example: "eyJhb ... wWFQ"})
    accessToken: string;
}

и TOKEN:

export enum TOKEN {
    AcceptTerms = "AcceptTerms",
    Session = "Session"
}

Но запись о том, что login() возвращает только JwtToken, вводит в заблуждение, как в случае 200 type - это Session, а в случае 451 это AcceptTerms.Полезные данные также существенно различаются:

export class JwtPayload {
  @ApiModelProperty({enum: TOKEN, description: "Token type"})
  type: TOKEN;

  @ApiModelProperty()
  issuedAt: number;
}

export class LoginJwtPayload extends JwtPayload {
  @ApiModelProperty()
  name: string;

  @ApiModelProperty({description: "T&C version accepted"})
  tncAccepted: number;
}

export class AcceptTermsJwtPayload extends JwtPayload {
  @ApiModelProperty({format: "email"})
  email: string;
}

200 использует LoginJwtPayload полезную нагрузку и 451 использует AcceptTermsJwtPayload.

Как документировать это с помощью Nest's SwaggerModule

...