Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validate extensions from schema URLs #664

Merged
merged 11 commits into from
Apr 14, 2021
Merged
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