Skip to content

Commit

Permalink
Validate extensions from schema URLs (#664)
Browse files Browse the repository at this point in the history
  • Loading branch information
jisantuc authored Apr 14, 2021
1 parent 4b3da4a commit ed56c68
Show file tree
Hide file tree
Showing 17 changed files with 647 additions and 362 deletions.
130 changes: 70 additions & 60 deletions application/src/main/scala/com/azavea/franklin/api/Server.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,13 @@ import com.azavea.franklin.api.endpoints.{
TileEndpoints
}
import com.azavea.franklin.api.services._
import com.azavea.franklin.extensions.validation.{collectionExtensionsRef, itemExtensionsRef}
import com.google.common.util.concurrent.ThreadFactoryBuilder
import doobie.hikari.HikariTransactor
import doobie.util.ExecutionContexts
import io.chrisdavenport.log4cats
import io.chrisdavenport.log4cats.SelfAwareStructuredLogger
import io.chrisdavenport.log4cats.slf4j.Slf4jLogger
import org.http4s._
import org.http4s.dsl.Http4sDsl
import org.http4s.implicits._
Expand Down Expand Up @@ -70,68 +74,74 @@ $$$$
apiConfig: ApiConfig,
dbConfig: DatabaseConfig
) =
for {
connectionEc <- ExecutionContexts.fixedThreadPool[IO](2)
transactionEc <- ExecutionContexts.cachedThreadPool[IO]
xa <- HikariTransactor.newHikariTransactor[IO](
"org.postgresql.Driver",
dbConfig.jdbcUrl,
dbConfig.dbUser,
dbConfig.dbPass,
connectionEc,
Blocker.liftExecutionContext(transactionEc)
)
collectionItemEndpoints = new CollectionItemEndpoints[IO](
apiConfig.defaultLimit,
apiConfig.enableTransactions,
apiConfig.enableTiles
)
collectionEndpoints = new CollectionEndpoints[IO](
apiConfig.enableTransactions,
apiConfig.enableTiles
)
landingPage = new LandingPageEndpoints[IO]()
allEndpoints = collectionEndpoints.endpoints ++ collectionItemEndpoints.endpoints ++ new SearchEndpoints[
IO
].endpoints ++ new TileEndpoints[
IO
](
apiConfig.enableTiles
).endpoints ++ landingPage.endpoints
docs = allEndpoints.toOpenAPI("Franklin", "0.0.1")
docRoutes = new SwaggerHttp4s(docs.toYaml, "open-api", "spec.yaml").routes[IO]
searchRoutes = new SearchService[IO](
apiConfig.apiHost,
apiConfig.defaultLimit,
apiConfig.enableTiles,
xa
).routes
tileRoutes = new TileService[IO](apiConfig.apiHost, apiConfig.enableTiles, xa).routes
collectionRoutes = new CollectionsService[IO](xa, apiConfig).routes <+> new CollectionItemsService[
IO
](
xa,
apiConfig
).routes
landingPageRoutes = new LandingPageService[IO](apiConfig).routes
router = CORS(
Router(
"/" -> ResponseLogger.httpRoutes(false, false)(
collectionRoutes <+> searchRoutes <+> tileRoutes <+> landingPageRoutes <+> docRoutes
)
AsyncHttpClientCatsBackend.resource[IO]() flatMap { implicit backend =>
for {
connectionEc <- ExecutionContexts.fixedThreadPool[IO](2)
transactionEc <- ExecutionContexts.cachedThreadPool[IO]
xa <- HikariTransactor.newHikariTransactor[IO](
"org.postgresql.Driver",
dbConfig.jdbcUrl,
dbConfig.dbUser,
dbConfig.dbPass,
connectionEc,
Blocker.liftExecutionContext(transactionEc)
)
).orNotFound
serverBuilderBlocker <- Blocker[IO]
server <- {
BlazeServerBuilder[IO](serverBuilderBlocker.blockingContext)
.bindHttp(apiConfig.internalPort.value, "0.0.0.0")
.withConnectorPoolSize(128)
.withBanner(banner)
.withHttpApp(router)
.resource
implicit0(logger: log4cats.Logger[IO]) = Slf4jLogger.getLogger[IO]
collectionItemEndpoints = new CollectionItemEndpoints[IO](
apiConfig.defaultLimit,
apiConfig.enableTransactions,
apiConfig.enableTiles
)
collectionEndpoints = new CollectionEndpoints[IO](
apiConfig.enableTransactions,
apiConfig.enableTiles
)
landingPage = new LandingPageEndpoints[IO]()
allEndpoints = collectionEndpoints.endpoints ++ collectionItemEndpoints.endpoints ++ new SearchEndpoints[
IO
].endpoints ++ new TileEndpoints[
IO
](
apiConfig.enableTiles
).endpoints ++ landingPage.endpoints
docs = allEndpoints.toOpenAPI("Franklin", "0.0.1")
docRoutes = new SwaggerHttp4s(docs.toYaml, "open-api", "spec.yaml").routes[IO]
searchRoutes = new SearchService[IO](
apiConfig.apiHost,
apiConfig.defaultLimit,
apiConfig.enableTiles,
xa
).routes
tileRoutes = new TileService[IO](apiConfig.apiHost, apiConfig.enableTiles, xa).routes
itemExtensions <- Resource.liftF { itemExtensionsRef[IO] }
collectionExtensions <- Resource.liftF { collectionExtensionsRef[IO] }
collectionRoutes = new CollectionsService[IO](xa, apiConfig, collectionExtensions).routes <+> new CollectionItemsService[
IO
](
xa,
apiConfig,
itemExtensions
).routes
landingPageRoutes = new LandingPageService[IO](apiConfig).routes
router = CORS(
Router(
"/" -> ResponseLogger.httpRoutes(false, false)(
collectionRoutes <+> searchRoutes <+> tileRoutes <+> landingPageRoutes <+> docRoutes
)
)
).orNotFound
serverBuilderBlocker <- Blocker[IO]
server <- {
BlazeServerBuilder[IO](serverBuilderBlocker.blockingContext)
.bindHttp(apiConfig.internalPort.value, "0.0.0.0")
.withConnectorPoolSize(128)
.withBanner(banner)
.withHttpApp(router)
.resource
}
} yield {
server
}
} yield {
server
}

override def run(args: List[String]): IO[ExitCode] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import com.azavea.franklin.error.{
NotFound,
ValidationError
}
import com.azavea.franklin.extensions.validation.ExtensionName
import com.azavea.stac4s.StacItem
import eu.timepit.refined.types.numeric.NonNegInt
import io.circe.{Codec => _, _}
Expand All @@ -31,7 +30,7 @@ class CollectionItemEndpoints[F[_]: Concurrent](
val base = endpoint.in("collections")

val collectionItemsList: Endpoint[
(String, Option[PaginationToken], Option[NonNegInt], List[ExtensionName]),
(String, Option[PaginationToken], Option[NonNegInt]),
Unit,
Json,
Fs2Streams[F]
Expand All @@ -47,10 +46,6 @@ class CollectionItemEndpoints[F[_]: Concurrent](
query[Option[NonNegInt]]("limit")
.description(s"How many items to return. Defaults to ${defaultLimit}")
)
.in(
query[List[ExtensionName]]("extensions")
.description("Return only items with listed supported extensions")
)
.out(jsonBody[Json])
.description("A feature collection of collection items")
.name("collectionItems")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import cats.syntax.traverse._
import com.azavea.franklin.database.{temporalExtentFromString, temporalExtentToString}
import com.azavea.franklin.datamodel.PaginationToken
import com.azavea.franklin.error.InvalidPatch
import com.azavea.franklin.extensions.validation.ExtensionName
import com.azavea.stac4s._
import com.azavea.stac4s.types.TemporalExtent
import eu.timepit.refined.types.string.NonEmptyString
Expand All @@ -21,9 +20,6 @@ import scala.util.Try

package object schemas {

implicit val extensionNameCodec: PlainCodec[ExtensionName] =
Codec.string.mapDecode(s => DecodeResult.Value(ExtensionName.fromString(s)))(_.toString)

implicit val schemaForTemporalExtent: Schema[TemporalExtent] = Schema(
schemaForCirceJson.schemaType
)
Expand Down
Loading

0 comments on commit ed56c68

Please sign in to comment.