Skip to content

Commit

Permalink
Refactor tapir related code into more readable structure
Browse files Browse the repository at this point in the history
Also improves naming a bit.
Functionality should remain unchanged.
  • Loading branch information
jnatten committed Oct 9, 2024
1 parent ee9de27 commit 9bed3ca
Show file tree
Hide file tree
Showing 118 changed files with 592 additions and 663 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,24 @@ package no.ndla.articleapi
import com.zaxxer.hikari.HikariDataSource
import no.ndla.articleapi.caching.MemoizeHelpers
import no.ndla.articleapi.controller.{ArticleControllerV2, InternController, SwaggerDocControllerConfig}
import no.ndla.articleapi.integration._
import no.ndla.articleapi.integration.*
import no.ndla.articleapi.repository.ArticleRepository
import no.ndla.articleapi.service._
import no.ndla.articleapi.service.search._
import no.ndla.articleapi.service.*
import no.ndla.articleapi.service.search.*
import no.ndla.articleapi.validation.ContentValidator
import no.ndla.articleapi.integration.SearchApiClient
import no.ndla.articleapi.model.api.ErrorHelpers
import no.ndla.articleapi.model.domain.DBArticle
import no.ndla.common.Clock
import no.ndla.common.configuration.BaseComponentRegistry
import no.ndla.network.NdlaClient
import no.ndla.network.tapir.{Routes, Service, SwaggerControllerConfig, TapirErrorHelpers, TapirHealthController}
import no.ndla.network.tapir.TapirApplication
import no.ndla.network.clients.{FeideApiClient, RedisClient}
import no.ndla.search.{BaseIndexService, Elastic4sClient}

class ComponentRegistry(properties: ArticleApiProperties)
extends BaseComponentRegistry[ArticleApiProperties]
with TapirApplication
with Props
with DataSource
with InternController
Expand All @@ -53,10 +54,6 @@ class ComponentRegistry(properties: ArticleApiProperties)
with ErrorHelpers
with DBArticle
with DBMigrator
with Routes[Eff]
with TapirErrorHelpers
with TapirHealthController
with SwaggerControllerConfig
with SwaggerDocControllerConfig
with FrontpageApiClient {
override val props: ArticleApiProperties = properties
Expand All @@ -65,9 +62,9 @@ class ComponentRegistry(properties: ArticleApiProperties)
override val dataSource: HikariDataSource = DataSource.getHikariDataSource
DataSource.connectToDatabase()

lazy val internController = new InternController
lazy val articleControllerV2 = new ArticleControllerV2
lazy val healthController: TapirHealthController[Eff] = new TapirHealthController[Eff]
lazy val internController = new InternController
lazy val articleControllerV2 = new ArticleControllerV2
lazy val healthController: TapirHealthController = new TapirHealthController

lazy val articleRepository = new ArticleRepository
lazy val articleSearchService = new ArticleSearchService
Expand Down Expand Up @@ -98,5 +95,5 @@ class ComponentRegistry(properties: ArticleApiProperties)
SwaggerDocControllerConfig.swaggerInfo
)

override def services: List[Service[Eff]] = swagger.getServices()
override def services: List[TapirController] = swagger.getServices()
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ package no.ndla.articleapi
import no.ndla.common.Warmup
import no.ndla.network.tapir.NdlaTapirMain

class MainClass(override val props: ArticleApiProperties) extends NdlaTapirMain[Eff] {
class MainClass(override val props: ArticleApiProperties) extends NdlaTapirMain {
val componentRegistry = new ComponentRegistry(props)

private def warmupRequest = (path: String, options: Map[String, String]) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ import no.ndla.articleapi.model.domain.Sort
import no.ndla.articleapi.service.search.{ArticleSearchService, SearchConverterService}
import no.ndla.articleapi.service.{ConverterService, ReadService, WriteService}
import no.ndla.articleapi.validation.ContentValidator
import no.ndla.articleapi.{Eff, Props}
import no.ndla.articleapi.Props
import no.ndla.common.ContentURIUtil.parseArticleIdAndRevision
import no.ndla.common.model.api.CommaSeparatedList.*
import no.ndla.language.Language.AllLanguages
import no.ndla.network.tapir.NoNullJsonPrinter.jsonBody
import no.ndla.network.tapir.Parameters.feideHeader
import no.ndla.network.tapir.{DynamicHeaders, Service}
import no.ndla.network.tapir.TapirErrors.errorOutputsFor
import no.ndla.network.tapir.{DynamicHeaders, TapirController}
import no.ndla.network.tapir.TapirUtil.errorOutputsFor
import sttp.model.{Header, MediaType}
import sttp.tapir.EndpointIO.annotations.{header, jsonbody}
import sttp.tapir.*
Expand All @@ -33,19 +33,13 @@ import sttp.tapir.server.ServerEndpoint
import scala.util.{Failure, Success, Try}

trait ArticleControllerV2 {
this: ReadService
with WriteService
with ArticleSearchService
with SearchConverterService
with ConverterService
with ContentValidator
with Props
with ErrorHelpers =>
this: ReadService & WriteService & ArticleSearchService & SearchConverterService & ConverterService &
ContentValidator & Props & ErrorHelpers & TapirController =>
val articleControllerV2: ArticleControllerV2

import props._

class ArticleControllerV2() extends Service[Eff] {
class ArticleControllerV2() extends TapirController {
protected val applicationDescription = "Services for accessing articles from NDLA."

override val serviceName: String = "articles"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,47 +8,39 @@

package no.ndla.articleapi.controller

import cats.implicits._
import cats.implicits.*
import com.typesafe.scalalogging.StrictLogging
import io.circe.generic.auto._
import no.ndla.articleapi.{Eff, Props}
import no.ndla.articleapi.model.api._
import io.circe.generic.auto.*
import no.ndla.articleapi.Props
import no.ndla.articleapi.model.api.*
import no.ndla.articleapi.model.domain.{ArticleIds, DBArticle}
import no.ndla.articleapi.repository.ArticleRepository
import no.ndla.articleapi.service._
import no.ndla.articleapi.service.*
import no.ndla.articleapi.service.search.{ArticleIndexService, IndexService}
import no.ndla.articleapi.validation.ContentValidator
import no.ndla.common.model.api.CommaSeparatedList._
import no.ndla.common.model.api.CommaSeparatedList.*
import no.ndla.common.model.domain.article.Article
import no.ndla.language.Language
import no.ndla.network.tapir.NoNullJsonPrinter.jsonBody
import no.ndla.network.tapir.TapirErrors.errorOutputsFor
import no.ndla.network.tapir.TapirUtil.errorOutputsFor
import no.ndla.network.tapir.auth.Permission.ARTICLE_API_WRITE
import no.ndla.network.tapir.{Service, TapirErrorHelpers}
import no.ndla.network.tapir.{TapirController, TapirErrorHelpers}
import sttp.model.StatusCode
import sttp.tapir._
import sttp.tapir.generic.auto._
import sttp.tapir.*
import sttp.tapir.generic.auto.*
import sttp.tapir.server.ServerEndpoint

import java.util.concurrent.{Executors, TimeUnit}
import scala.concurrent._
import scala.concurrent.*
import scala.concurrent.duration.Duration
import scala.util.{Failure, Success}

trait InternController {
this: ReadService
with WriteService
with ConverterService
with ArticleRepository
with IndexService
with ArticleIndexService
with ContentValidator
with TapirErrorHelpers
with Props
with DBArticle =>
this: ReadService & WriteService & ConverterService & ArticleRepository & IndexService & ArticleIndexService &
ContentValidator & TapirErrorHelpers & Props & DBArticle & TapirController =>
val internController: InternController

class InternController extends Service[Eff] with StrictLogging {
class InternController extends TapirController with StrictLogging {
import ErrorHelpers._

override val prefix: EndpointInput[Unit] = "intern"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ package no.ndla.articleapi.controller
import no.ndla.articleapi.Props
import no.ndla.network.tapir.auth.Permission
import no.ndla.network.tapir.{SwaggerControllerConfig, SwaggerInfo}
import sttp.tapir._
import sttp.tapir.*

trait SwaggerDocControllerConfig extends SwaggerControllerConfig {
this: Props =>
trait SwaggerDocControllerConfig {
this: Props & SwaggerControllerConfig =>

object SwaggerDocControllerConfig {
private val scopes = Permission.toSwaggerMap(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,24 +10,25 @@ package no.ndla.articleapi

import com.zaxxer.hikari.HikariDataSource
import no.ndla.articleapi.caching.MemoizeHelpers
import no.ndla.articleapi.controller._
import no.ndla.articleapi.integration._
import no.ndla.articleapi.controller.*
import no.ndla.articleapi.integration.*
import no.ndla.articleapi.repository.ArticleRepository
import no.ndla.articleapi.service._
import no.ndla.articleapi.service.search._
import no.ndla.articleapi.service.*
import no.ndla.articleapi.service.search.*
import no.ndla.articleapi.validation.ContentValidator
import no.ndla.articleapi.integration.SearchApiClient
import no.ndla.articleapi.model.api.ErrorHelpers
import no.ndla.articleapi.model.domain.DBArticle
import no.ndla.common.Clock
import no.ndla.network.NdlaClient
import no.ndla.network.clients.{FeideApiClient, RedisClient}
import no.ndla.network.tapir.{Routes, Service, TapirHealthController}
import no.ndla.network.tapir.TapirApplication
import no.ndla.search.{BaseIndexService, Elastic4sClient}
import org.scalatestplus.mockito.MockitoSugar

trait TestEnvironment
extends Elastic4sClient
extends TapirApplication
with Elastic4sClient
with ArticleSearchService
with ArticleIndexService
with IndexService
Expand All @@ -36,7 +37,6 @@ trait TestEnvironment
with ArticleControllerV2
with InternController
with DataSource
with Routes[Eff]
with ArticleRepository
with MockitoSugar
with SearchApiClient
Expand All @@ -46,7 +46,6 @@ trait TestEnvironment
with NdlaClient
with SearchConverterService
with ReadService
with TapirHealthController
with WriteService
with ContentValidator
with Clock
Expand All @@ -70,7 +69,7 @@ trait TestEnvironment
val internController: InternController = mock[InternController]
val articleControllerV2: ArticleControllerV2 = mock[ArticleControllerV2]

val healthController = mock[TapirHealthController[Eff]]
val healthController = mock[TapirHealthController]

val dataSource: HikariDataSource = mock[HikariDataSource]
val articleRepository: ArticleRepository = mock[ArticleRepository]
Expand All @@ -90,5 +89,5 @@ trait TestEnvironment

val clock: SystemClock = mock[SystemClock]

def services: List[Service[Eff]] = List.empty
def services: List[TapirController] = List.empty
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,15 @@ package no.ndla.articleapi.controller

import no.ndla.articleapi.model.search.SearchResult
import no.ndla.articleapi.model.{api, domain}
import no.ndla.articleapi.{Eff, TestEnvironment, UnitSuite}
import no.ndla.articleapi.{TestEnvironment, UnitSuite}
import no.ndla.tapirtesting.TapirControllerTest
import org.mockito.ArgumentMatchers.{eq as eqTo, *}
import org.mockito.Mockito.{never, reset, times, verify, when}
import sttp.client3.quick.*

import scala.util.{Failure, Success}

class ArticleControllerV2Test extends UnitSuite with TestEnvironment with TapirControllerTest[Eff] {
class ArticleControllerV2Test extends UnitSuite with TestEnvironment with TapirControllerTest {

val legacyAuthHeaderWithWriteRole =
"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcHBfbWV0YWRhdGEiOnsicm9sZXMiOlsiYXJ0aWNsZXM6d3JpdGUiXSwibmRsYV9pZCI6ImFiYzEyMyJ9LCJuYW1lIjoiRG9uYWxkIER1Y2siLCJpc3MiOiJodHRwczovL3NvbWUtZG9tYWluLyIsInN1YiI6Imdvb2dsZS1vYXV0aDJ8MTIzIiwiYXVkIjoiYWJjIiwiZXhwIjoxNDg2MDcwMDYzLCJpYXQiOjE0ODYwMzQwNjN9.VxqM2bu2UF8IAalibIgdRdmsTDDWKEYpKzHPbCJcFzA"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@

package no.ndla.articleapi.controller

import no.ndla.articleapi.{Eff, TestEnvironment, UnitSuite}
import no.ndla.articleapi.{TestEnvironment, UnitSuite}
import no.ndla.tapirtesting.TapirControllerTest
import sttp.client3.quick._

class HealthControllerTest extends UnitSuite with TestEnvironment with TapirControllerTest[Eff] {
override val controller: TapirHealthController[Eff] = new TapirHealthController[Eff]()
class HealthControllerTest extends UnitSuite with TestEnvironment with TapirControllerTest {
override val controller: TapirHealthController = new TapirHealthController()
controller.setWarmedUp()

test("That /health returns 200 ok") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@

package no.ndla.articleapi.controller

import no.ndla.articleapi.{Eff, TestEnvironment, UnitSuite}
import no.ndla.articleapi.{TestEnvironment, UnitSuite}
import no.ndla.common.model.domain.article.Article
import no.ndla.common.model.domain.Author
import no.ndla.network.tapir.Service
import no.ndla.tapirtesting.TapirControllerTest
import org.mockito.ArgumentMatchers.{any, eq as eqTo}
import org.mockito.Mockito.{doReturn, never, reset, times, verify, verifyNoMoreInteractions, when}
Expand All @@ -20,10 +19,10 @@ import sttp.client3.quick.*

import scala.util.{Failure, Success}

class InternControllerTest extends UnitSuite with TestEnvironment with TapirControllerTest[Eff] {
class InternControllerTest extends UnitSuite with TestEnvironment with TapirControllerTest {
val author: Author = Author("forfatter", "Henrik")

val controller: Service[Eff] = new InternController
val controller: TapirController = new InternController

when(clock.now()).thenCallRealMethod()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ import no.ndla.common.Clock
import no.ndla.common.aws.NdlaS3Client
import no.ndla.common.configuration.BaseComponentRegistry
import no.ndla.network.NdlaClient
import no.ndla.network.tapir.{Routes, Service, SwaggerControllerConfig, TapirHealthController}
import no.ndla.network.tapir.TapirApplication
import no.ndla.search.{BaseIndexService, Elastic4sClient}

class ComponentRegistry(properties: AudioApiProperties)
extends BaseComponentRegistry[AudioApiProperties]
with TapirApplication
with DataSource
with AudioRepository
with SeriesRepository
Expand All @@ -34,7 +35,6 @@ class ComponentRegistry(properties: AudioApiProperties)
with ConverterService
with InternController
with HealthController
with TapirHealthController
with AudioController
with SeriesController
with SearchService
Expand All @@ -48,9 +48,7 @@ class ComponentRegistry(properties: AudioApiProperties)
with SeriesIndexService
with TagIndexService
with SearchConverterService
with SwaggerControllerConfig
with Clock
with Routes[Eff]
with Props
with DBMigrator
with ErrorHelpers
Expand Down Expand Up @@ -99,5 +97,5 @@ class ComponentRegistry(properties: AudioApiProperties)
SwaggerDocControllerConfig.swaggerInfo
)

override def services: List[Service[Eff]] = swagger.getServices()
override def services: List[TapirController] = swagger.getServices()
}
2 changes: 1 addition & 1 deletion audio-api/src/main/scala/no/ndla/audioapi/MainClass.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ package no.ndla.audioapi
import no.ndla.common.Warmup
import no.ndla.network.tapir.NdlaTapirMain

class MainClass(val props: AudioApiProperties) extends NdlaTapirMain[Eff] {
class MainClass(val props: AudioApiProperties) extends NdlaTapirMain {
private val componentRegistry = new ComponentRegistry(props)

private def warmupRequest = (path, params) => Warmup.warmupRequest(props.ApplicationPort, path, params)
Expand Down
Loading

0 comments on commit 9bed3ca

Please sign in to comment.