You can use this extension in dotnet (.NET 6 in my case) for enforcing developers to sync OpenAPI (Swagger) descriptions with implementations of methods.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseSwaggerResponseCheck();
//...
}
[ApiController]
[Route("[controller]")]
public class ExampleController : ControllerBase
{
[HttpGet]
[ValidateStatusCodes] // <-- Use this
[SwaggerOperation("LoginUser")]
[SwaggerResponse(statusCode: StatusCodes.Status200OK, type: null, description: "signed user email account")]
[SwaggerResponse(statusCode: StatusCodes.Status400BadRequest, type: null, description: "wrong email or password")]
[Route("/users/login")]
public virtual IActionResult LoginUser([FromQuery][Required()] string email, [FromQuery] string password)
{
if (email == "[email protected]")
return Ok("success");
else if (email == "")
return BadRequest("email required");
else
return NotFound("user not found"); // 500 - InternalServerError because not attributed with SwaggerResponse.
}
// ...
[HttpGet]
[ValidateStatusCodes] // <-- Use this
[ProducesResponseType(type: typeof(Account), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[Route("/users/login2")]
public virtual IActionResult LoginUser2([FromQuery][Required()] string email, [FromQuery] string password)
{
if (email == "[email protected]")
return Ok("success").Validate();
else if (email == "")
return BadRequest("email required").Validate();
else
return NotFound("user not found").Validate(); // Throws error in DEBUG or Development.
}
}
[ApiController]
[Route("[controller]")]
public class ExampleController : ControllerBase
{
[HttpGet]
[SwaggerOperation("LoginUser")]
[SwaggerResponse(statusCode: StatusCodes.Status200OK, type: null, description: "signed user email account")]
[SwaggerResponse(statusCode: StatusCodes.Status400BadRequest, type: null, description: "wrong email or password")]
[Route("/users/login")]
public virtual IActionResult LoginUser([FromQuery][Required()] string email, [FromQuery] string password)
{
if (email == "[email protected]")
return Ok("success").Validate();
else if (email == "")
return BadRequest("email required").Validate();
else if (email == "secret")
return Unauthorized("hello");
// Passed, independent of SwaggerResponse attribute.
else
return NotFound("user not found").Validate();
// 500 - InternalServerError because not attributed with SwaggerResponse.
}
// ...
[HttpGet]
[ProducesResponseType(type: typeof(Account), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[Route("/users/login2")]
public virtual IActionResult LoginUser2([FromQuery][Required()] string email, [FromQuery] string password)
{
if (email == "[email protected]")
return Ok("success").Validate();
else if (email == "")
return BadRequest("email required").Validate();
else
return NotFound("user not found").Validate(); // Throws error in DEBUG or Development.
}
}