forked from loafle/openapi-generator-original
162 lines
4.2 KiB
Scala
162 lines
4.2 KiB
Scala
package api
|
|
|
|
import org.openapitools.OpenApiExceptions
|
|
import javax.inject.{Inject, Singleton}
|
|
import play.api.libs.json._
|
|
import play.api.mvc._
|
|
import model.ApiResponse
|
|
import model.Pet
|
|
import play.api.libs.Files.TemporaryFile
|
|
|
|
|
|
@Singleton
|
|
class PetApiController @Inject()(cc: ControllerComponents, api: PetApi) extends AbstractController(cc) {
|
|
/**
|
|
* POST /v2/pet
|
|
*/
|
|
def addPet(): Action[AnyContent] = Action { request =>
|
|
def executeApi(): Unit = {
|
|
val body = request.body.asJson.map(_.as[Pet]).getOrElse {
|
|
throw new OpenApiExceptions.MissingRequiredParameterException("body", "body")
|
|
}
|
|
api.addPet(body)
|
|
}
|
|
|
|
executeApi()
|
|
Ok
|
|
}
|
|
|
|
/**
|
|
* DELETE /v2/pet/:petId
|
|
* @param petId Pet id to delete
|
|
*/
|
|
def deletePet(petId: Long): Action[AnyContent] = Action { request =>
|
|
def executeApi(): Unit = {
|
|
val apiKey = request.headers.get("api_key")
|
|
|
|
api.deletePet(petId, apiKey)
|
|
}
|
|
|
|
executeApi()
|
|
Ok
|
|
}
|
|
|
|
/**
|
|
* GET /v2/pet/findByStatus?status=[value]
|
|
*/
|
|
def findPetsByStatus(): Action[AnyContent] = Action { request =>
|
|
def executeApi(): List[Pet] = {
|
|
val status = request.getQueryString("status")
|
|
.map(values => splitCollectionParam(values, "csv"))
|
|
.getOrElse {
|
|
throw new OpenApiExceptions.MissingRequiredParameterException("status", "query string")
|
|
}
|
|
api.findPetsByStatus(status)
|
|
}
|
|
|
|
val result = executeApi()
|
|
val json = Json.toJson(result)
|
|
Ok(json)
|
|
}
|
|
|
|
/**
|
|
* GET /v2/pet/findByTags?tags=[value]
|
|
*/
|
|
def findPetsByTags(): Action[AnyContent] = Action { request =>
|
|
def executeApi(): List[Pet] = {
|
|
val tags = request.getQueryString("tags")
|
|
.map(values => splitCollectionParam(values, "csv"))
|
|
.getOrElse {
|
|
throw new OpenApiExceptions.MissingRequiredParameterException("tags", "query string")
|
|
}
|
|
api.findPetsByTags(tags)
|
|
}
|
|
|
|
val result = executeApi()
|
|
val json = Json.toJson(result)
|
|
Ok(json)
|
|
}
|
|
|
|
/**
|
|
* GET /v2/pet/:petId
|
|
* @param petId ID of pet to return
|
|
*/
|
|
def getPetById(petId: Long): Action[AnyContent] = Action { request =>
|
|
def executeApi(): Pet = {
|
|
api.getPetById(petId)
|
|
}
|
|
|
|
val result = executeApi()
|
|
val json = Json.toJson(result)
|
|
Ok(json)
|
|
}
|
|
|
|
/**
|
|
* PUT /v2/pet
|
|
*/
|
|
def updatePet(): Action[AnyContent] = Action { request =>
|
|
def executeApi(): Unit = {
|
|
val body = request.body.asJson.map(_.as[Pet]).getOrElse {
|
|
throw new OpenApiExceptions.MissingRequiredParameterException("body", "body")
|
|
}
|
|
api.updatePet(body)
|
|
}
|
|
|
|
executeApi()
|
|
Ok
|
|
}
|
|
|
|
/**
|
|
* POST /v2/pet/:petId
|
|
* @param petId ID of pet that needs to be updated
|
|
*/
|
|
def updatePetWithForm(petId: Long): Action[AnyContent] = Action { request =>
|
|
def executeApi(): Unit = {
|
|
val name = (request.body.asMultipartFormData.map(_.asFormUrlEncoded) orElse request.body.asFormUrlEncoded)
|
|
.flatMap(_.get("name"))
|
|
.flatMap(_.headOption)
|
|
|
|
val status = (request.body.asMultipartFormData.map(_.asFormUrlEncoded) orElse request.body.asFormUrlEncoded)
|
|
.flatMap(_.get("status"))
|
|
.flatMap(_.headOption)
|
|
|
|
api.updatePetWithForm(petId, name, status)
|
|
}
|
|
|
|
executeApi()
|
|
Ok
|
|
}
|
|
|
|
/**
|
|
* POST /v2/pet/:petId/uploadImage
|
|
* @param petId ID of pet to update
|
|
*/
|
|
def uploadFile(petId: Long): Action[AnyContent] = Action { request =>
|
|
def executeApi(): ApiResponse = {
|
|
val additionalMetadata = (request.body.asMultipartFormData.map(_.asFormUrlEncoded) orElse request.body.asFormUrlEncoded)
|
|
.flatMap(_.get("additionalMetadata"))
|
|
.flatMap(_.headOption)
|
|
|
|
val file = request.body.asMultipartFormData.flatMap(_.file("file").map(_.ref: TemporaryFile))
|
|
|
|
api.uploadFile(petId, additionalMetadata, file)
|
|
}
|
|
|
|
val result = executeApi()
|
|
val json = Json.toJson(result)
|
|
Ok(json)
|
|
}
|
|
|
|
private def splitCollectionParam(paramValues: String, collectionFormat: String): List[String] = {
|
|
val splitBy =
|
|
collectionFormat match {
|
|
case "csv" => ",+"
|
|
case "tsv" => "\t+"
|
|
case "ssv" => " +"
|
|
case "pipes" => "|+"
|
|
}
|
|
|
|
paramValues.split(splitBy).toList
|
|
}
|
|
}
|