tsoa icon indicating copy to clipboard operation
tsoa copied to clipboard

request body @pattern validation has no effect after upgrade to v6.0.0

Open RobYed opened this issue 2 years ago • 5 comments

I upgraded tsoa from v5.1.1 to v6.0.0 in my project. After that a POST endpoint does not evaluate a (nested) @pattern validation annotation anymore and just passes the request to the controller.

Sorting

  • I'm submitting a ...

    • [x] bug report
    • [ ] feature request
    • [ ] support request
  • I confirm that I

    • [x] used the search to make sure that a similar issue hasn't already been submit

Expected Behavior

Given the following CreateParticipantRequestDto interface and docs for the request body, I expect tsoa to reject any request which does not contain a valid pseudonym value:

/**
 * The pseudonym is the unique identifier of a participant.
 *
 * @pattern ^[a-z]+-[0-9]+$ The pseudonym is only allowed to consist of lower case characters
 * @example "abcd-1234"
 */
export type Pseudonym = string;

export interface ParticipantDto {
  pseudonym: Pseudonym;
  study: string;
  studyCenter: string | null;

  /**
   * The optional examination wave in which the participant participates.
   *
   * @isInt
   */
  examinationWave: number | null;
}

export type CreateParticipantRequestDto = Partial<
  Pick<
    ParticipantDto,
    | 'pseudonym'
    | 'studyCenter'
    | 'examinationWave'
  >
>;

Controller method:

@Post()
public async postParticipant(
    @Path() studyName: string,
    @Body() participant: CreateParticipantRequestDto
): Promise<CreateParticipantResponseDto> {
    // ...
}

If I send this request body, I expect tsoa to reject the request because the pseudonym does not match the @pattern regex.

{
    "pseudonym": "QTest-0001",
    "studyCenter": "test_sz",
    "examinationWave": 1,
}

Current Behavior

The @pattern validation does not lead to a rejected request if the body is invalid.

However, the @isInt validation in the above example does work as expected.

Possible Solution

Steps to Reproduce

see code snippets above

Context (Environment)

Version of the library: 6.0.0 Version of NodeJS: v20.3.0

  • Confirm you were using yarn not npm: [ ]

Detailed Description

Breaking change?

RobYed avatar Jan 05 '24 11:01 RobYed

Hello there RobYed 👋

Thank you for opening your very first issue in this project.

We will try to get back to you as soon as we can.👀

github-actions[bot] avatar Jan 05 '24 11:01 github-actions[bot]

I see you're using a Partial and a Pick in your interfaces, we have found some other issues when using these utility types: https://github.com/lukeautry/tsoa/issues/1515

For a workaround, I'm betting if you hardcoded the interface without using Pick/Partial that you'd get your validation back

gcv-epalmer avatar Jan 08 '24 15:01 gcv-epalmer

@gcv-epalmer Thanks for your quick response. Yes, you are right. When I turn CreateParticipantRequestDto into a usual interface, everything works as expected. However, this is something we don't want to do. A fix would be great :)

RobYed avatar Jan 09 '24 07:01 RobYed

@RobYed Would you like to open a PR?

WoH avatar Jan 09 '24 10:01 WoH

@WoH I would like to. However, I do not have any glue of the codebase. Also I don't know what changed from v5.1.1 to v6.0.0. I currently don't have the time to familiarise myself with it :/

RobYed avatar Jan 10 '24 07:01 RobYed