finch.api.mustache Maven / Gradle / Ivy
package {{apiPackage}}
import java.io._
import {{packageName}}._
import {{modelPackage}}._
{{#imports}}import {{import}}
{{/imports}}
import io.finch.circe._
import io.circe.generic.semiauto._
import com.twitter.concurrent.AsyncStream
import com.twitter.finagle.Service
import com.twitter.finagle.Http
import com.twitter.finagle.http.{Request, Response}
import com.twitter.finagle.http.exp.Multipart.{FileUpload, InMemoryFileUpload, OnDiskFileUpload}
import com.twitter.util.Future
import com.twitter.io.Buf
import io.finch._, items._
import java.io.File
import java.nio.file.Files
import java.nio.file.Paths
import java.time._
object {{classname}} {
/**
* Compiles all service endpoints.
* @return Bundled compilation of all service endpoints.
*/
def endpoints(da: DataAccessor) =
{{#operations}}
{{#operation}}
{{{operationId}}}(da){{^-last}} :+:{{/-last}}
{{/operation}}
{{/operations}}
private def checkError(e: CommonError) = e match {
case InvalidInput(_) => BadRequest(e)
case MissingIdentifier(_) => BadRequest(e)
case RecordNotFound(_) => NotFound(e)
case _ => InternalServerError(e)
}
implicit class StringOps(s: String) {
import java.time.format.DateTimeFormatter
lazy val localformatter: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")
lazy val datetimeformatter: DateTimeFormatter =
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
def toLocalDateTime: LocalDateTime = LocalDateTime.parse(s,localformatter)
def toZonedDateTime: ZonedDateTime = ZonedDateTime.parse(s, datetimeformatter)
}
{{#operations}}
{{#operation}}
/**
* {{{description}}}
* @return An endpoint representing a {{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}
*/
private def {{operationId}}(da: DataAccessor): Endpoint[{{#returnType}}{{returnType}}{{/returnType}}{{^returnType}}Unit{{/returnType}}] =
{{httpMethod}}({{{vendorExtensions.x-codegen-paths}}}) { {{#hasParams}}({{{vendorExtensions.x-codegen-typedParams}}}) => {{/hasParams}}
da.{{baseName}}_{{operationId}}({{{vendorExtensions.x-codegen-params}}}) match {
case Left(error) => checkError(error)
case Right(data) => Ok(data)
}
} handle {
case e: Exception => BadRequest(e)
}
{{/operation}}
{{/operations}}
implicit private def fileUploadToFile(fileUpload: FileUpload) : File = {
fileUpload match {
case upload: InMemoryFileUpload =>
bytesToFile(Buf.ByteArray.Owned.extract(upload.content))
case upload: OnDiskFileUpload =>
upload.content
case _ => null
}
}
private def bytesToFile(input: Array[Byte]): java.io.File = {
val file = Files.createTempFile("tmp{{classname}}", null).toFile()
val output = new FileOutputStream(file)
output.write(input)
file
}
// This assists in params(string) application (which must be Seq[A] in parameter list) when the param is used as a List[A] elsewhere.
implicit def seqList[A](input: Seq[A]): List[A] = input.toList
}