0

This is the first time I've experienced this in my entire application. I have a new controller defined as such

    [Authorize]
    [ApiController]
    public class AdvertisementsController : ControllerBase
    {
        private readonly IAdvertisementStore _store;
        private readonly IGetAdvertisementDashboardUseCase _dashboard;

        private JsonPresenter jsonPresenter = new JsonPresenter();
        private ViewModelPresenter<AdvertisementListViewModel> adListPresenter = new ViewModelPresenter<AdvertisementListViewModel>();
        private ViewModelPresenter<AdvertisementDetailsViewModel> adDetailsPresenter = new ViewModelPresenter<AdvertisementDetailsViewModel>();
        private ViewModelPresenter<AdvertisementDashboardViewModel> dashboardPresenter = new ViewModelPresenter<AdvertisementDashboardViewModel>();

        public AdvertisementsController(IAdvertisementStore advertisementStore,
                                        IGetAdvertisementDashboardUseCase getAdvertisementDashboardUseCase)
        {
            _store = advertisementStore;
            _dashboard = getAdvertisementDashboardUseCase;
        }

        [HttpPost]
        [ValidateModel]
        [Route("api/advertisement")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<GenericResponse>> CreateAdvertisement([FromBody] AdvertisementRequest request)
        {
            await _store.Handle(AccessEvent.Create, request, jsonPresenter);
            return jsonPresenter.ContentResult;
        }

        [HttpGet]
        [ValidateModel]
        [Route("api/advertisement")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<AdvertisementDetailsViewModel>> GetAdvertisement([FromQuery] GenericRequest request)
        {
            await _store.Handle(AccessEvent.Read, request, adDetailsPresenter);
            return adDetailsPresenter.ContentResult;
        }

        [HttpGet]
        [ValidateModel]
        [Route("api/advertisements")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<AdvertisementListViewModel>> GetAdvertisements([FromQuery] AdvertisementPaginatingRequest request)
        {
            await _store.Handle(AccessEvent.ReadList, request, adListPresenter);
            return adListPresenter.ContentResult;
        }

        [HttpPut]
        [ValidateModel]
        [Route("api/advertisement")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<GenericResponse>> EditAdvertisement([FromBody] AdvertisementRequest request)
        {
            await _store.Handle(AccessEvent.Update, request, jsonPresenter);
            return jsonPresenter.ContentResult;
        }

        [HttpDelete]
        [ValidateModel]
        [Route("api/advertisement")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<GenericResponse>> DeleteAdvertisement([FromQuery] GenericRequest request)
        {
            await _store.Handle(AccessEvent.Delete, request, jsonPresenter);
            return jsonPresenter.ContentResult;
        }

        [HttpGet]
        [ValidateModel]
        [Route("api/advertisement_dashboard")]
        [Authorize(Policy = Policies.ADVERTISEMENTS)]
        public async Task<ActionResult<AdvertisementDashboardViewModel>> Dashboard([FromQuery] AdvertisementDashboardListRequest request)
        {
            await _dashboard.Handle(request, dashboardPresenter);
            return dashboardPresenter.ContentResult;
        }
    }

Looks just like everyone of my other controllers. For some reason on my Swagger UI the GET api/advertisements and GET api/advertisement_dashboard endpoints return the following error when I try to execute it

enter image description here

But as soon as I change the name to api/advertisementts or api/advertisementt_dashboard (adding a random t to the route names) it works just fine. This is only an issue using Swagger UI though, making a cURL request or using Postman the endpoints work just fine. Seems like swagger isn't correctly finding those endpoints for some reason?

Relevant Swagger.json schema

    "/api/advertisement": {
      "post": {
        "tags": [
          "Advertisements"
        ],
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Advertisements"
        ],
        "parameters": [
          {
            "name": "Id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "AdditionalArg",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDetailsViewModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDetailsViewModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDetailsViewModel"
                }
              }
            }
          }
        }
      },
      "put": {
        "tags": [
          "Advertisements"
        ],
        "requestBody": {
          "content": {
            "application/json-patch+json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AdvertisementRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Advertisements"
        ],
        "parameters": [
          {
            "name": "Id",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "AdditionalArg",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericResponse"
                }
              }
            }
          }
        }
      }
    },
    "/api/advertisements": {
      "get": {
        "tags": [
          "Advertisements"
        ],
        "parameters": [
          {
            "name": "Type",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AdvertisementType"
            }
          },
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AdvertisementStatus"
            }
          },
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Take",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Skip",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SearchField",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementListViewModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementListViewModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementListViewModel"
                }
              }
            }
          }
        }
      }
    },
    "/api/advertisement_dashboard": {
      "get": {
        "tags": [
          "Advertisements"
        ],
        "parameters": [
          {
            "name": "PlatformIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "integer",
                "format": "int32"
              }
            }
          },
          {
            "name": "StartDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "EndDate",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Take",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Skip",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SearchField",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDashboardViewModel"
                }
              },
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDashboardViewModel"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdvertisementDashboardViewModel"
                }
              }
            }
          }
        }
      }
    }

I'd rather not change my naming convention just so I can use Swagger to test out my endpoints.

5

0

Browse other questions tagged or ask your own question.