Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions institutions-api/src/main/resources/application.conf
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ hmda {
timeout = 5000
}
}
runtime.mode = "dev"
runtime.mode = ${?HMDA_RUNTIME_MODE}
}

institution_db {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ object HmdaInstitutionApi extends App {
val kafkaConfig = system.settings.config.getConfig("akka.kafka.consumer")

val jdbcUrl = config.getString("db.db.url")
log.info(s"Connection URL is \n\n$jdbcUrl\n")

system.spawn[Nothing](HmdaInstitutionQueryApi(), HmdaInstitutionQueryApi.name)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import akka.actor.{ ActorSystem, CoordinatedShutdown }
import akka.http.scaladsl.server.Directives._
import hmda.api.http.directives.HmdaTimeDirectives._
import hmda.api.http.routes.BaseHttpApi
import hmda.auth.OAuth2Authorization

import scala.concurrent.ExecutionContext

Expand All @@ -20,10 +21,13 @@ object HmdaInstitutionQueryApi {
implicit val classic: ActorSystem = ctx.system.toClassic
val shutdown: CoordinatedShutdown = CoordinatedShutdown(ctx.system)
val config = classic.settings.config
val log = ctx.log
val oAuth2Authorization = OAuth2Authorization(log, config)
val host: String = config.getString("hmda.institution.http.host")
val port: Int = config.getInt("hmda.institution.http.port")
val institutionRoute = InstitutionQueryHttpApi.create(config)

val routes = BaseHttpApi.routes(name) ~ InstitutionQueryHttpApi.create(config)
val routes = BaseHttpApi.routes(name) ~ institutionRoute(oAuth2Authorization)
BaseHttpApi.runServer(shutdown, name)(timed(routes), host, port)

Behaviors.ignore
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ import slick.basic.DatabaseConfig
import slick.jdbc.JdbcProfile
import hmda.api.http.EmailUtils._
import org.slf4j.LoggerFactory
import hmda.auth.OAuth2Authorization

import scala.concurrent.{ExecutionContext, Future}
import scala.util.{Failure, Success}

object InstitutionQueryHttpApi {
def create(config: Config)(implicit ec: ExecutionContext): Route =
def create(config: Config)(implicit ec: ExecutionContext): OAuth2Authorization => Route =
new InstitutionQueryHttpApi(config)(ec).institutionPublicRoutes
}

private class InstitutionQueryHttpApi(config: Config)(implicit ec: ExecutionContext) extends InstitutionEmailComponent with InstitutionNoteHistoryComponent{
val dbConfig = DatabaseConfig.forConfig[JdbcProfile]("institution_db")

Expand Down Expand Up @@ -69,30 +71,17 @@ private class InstitutionQueryHttpApi(config: Config)(implicit ec: ExecutionCont
}
}

private val institutionByDomainPath =
path("institutions" / "year" / IntNumber) { year =>
(extractUri & get) { uri =>
isInstitutionsYearAllowed(yearsAvailable.contains(year.toString)){
parameter('domain.as[String]) { domain =>
val f = findByEmail(domain, year.toString)
completeInstitutionsFuture(f, uri)
} ~
parameters('domain.as[String], 'lei.as[String], 'respondentName.as[String], 'taxId.as[String]) {
(domain, lei, respondentName, taxId) =>
val f = findByFields(lei, respondentName, taxId, domain, year.toString)
completeInstitutionsFuture(f, uri)
}
}
}
}

private val institutionHistoryPath =
private def institutionHistoryPath(oAuth2Authorization: OAuth2Authorization) = {
val hmdaAdminRole = "hmda-admin"
path("institutions" / Segment / "year" / IntNumber / "history") { (lei, year) =>
(extractUri & get) { uri =>
val f = institutionNoteHistoryRepository.findInstitutionHistory( year.toString,lei)
completeInstitutionsNoteHistoryFuture(f, uri)
oAuth2Authorization.authorizeTokenWithRole(hmdaAdminRole) { _ =>
val f = institutionNoteHistoryRepository.findInstitutionHistory( year.toString,lei)
completeInstitutionsNoteHistoryFuture(f, uri)
}
}
}
}

def completeInstitutionsNoteHistoryFuture(f: Future[Seq[InstitutionNoteHistoryEntity]], uri: Uri): Route = {
val entityMarshaller: PartialFunction[Seq[InstitutionNoteHistoryEntity], ToResponseMarshallable] = {
Expand All @@ -102,7 +91,7 @@ private class InstitutionQueryHttpApi(config: Config)(implicit ec: ExecutionCont
completeFuture(f, uri, entityMarshaller)
}

private val institutionByDomainDefaultPath =
private val institutionByDomainPath =
path("institutions") {
(extractUri & get) { uri =>
parameter('domain.as[String]) { domain =>
Expand Down Expand Up @@ -181,11 +170,11 @@ private class InstitutionQueryHttpApi(config: Config)(implicit ec: ExecutionCont
complete(ToResponseMarshallable(StatusCodes.NotFound -> errorResponse))
}

def institutionPublicRoutes: Route =
def institutionPublicRoutes(oAuth2Authorization: OAuth2Authorization): Route =
handleRejections(corsRejectionHandler) {
cors() {
encodeResponse {
institutionByIdPath ~ institutionByDomainPath ~ institutionHistoryPath ~ institutionByDomainDefaultPath ~
institutionByIdPath ~ institutionByDomainPath ~ institutionHistoryPath(oAuth2Authorization) ~
quarterlyFilersLarCountsPath
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import hmda.institution.query.InstitutionSetup
import hmda.model.institution.Institution
import io.circe.generic.auto._
import org.scalatest.{ BeforeAndAfterAll, MustMatchers, WordSpec }
import hmda.auth.{ KeycloakTokenVerifier, OAuth2Authorization }
import org.slf4j.{ Logger, LoggerFactory }

import scala.concurrent.ExecutionContext

Expand All @@ -19,7 +21,14 @@ class InstitutionQueryHttpApiSpec extends WordSpec with MustMatchers with Before
val ec: ExecutionContext = system.dispatcher
val config = ConfigFactory.load()
implicit val timeout = Timeout(duration)
val institutionPublicRoutes: Route = InstitutionQueryHttpApi.create(config)
val log: Logger = LoggerFactory.getLogger(getClass)

val oAuth2Authorization = OAuth2Authorization(
log,
new KeycloakTokenVerifier
)

val institutionPublicRoutes = InstitutionQueryHttpApi.create(config)

override def beforeAll: Unit = {
super.beforeAll()
Expand All @@ -31,59 +40,45 @@ class InstitutionQueryHttpApiSpec extends WordSpec with MustMatchers with Before
tearDown()
}



"Institution Query HTTP API" must {
"search by LEI" in {
Get("/institutions/XXX/year/2018") ~> institutionPublicRoutes ~> check {
Get("/institutions/XXX/year/2018") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.NotFound
}

Get("/institutions/XXX/year/2019") ~> institutionPublicRoutes ~> check {
Get("/institutions/XXX/year/2019") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.NotFound
}

Get("/institutions/XXX/year/2020") ~> institutionPublicRoutes ~> check {
Get("/institutions/XXX/year/2020") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.NotFound
}

Get(s"/institutions/AAA/year/2018") ~> institutionPublicRoutes ~> check {
Get(s"/institutions/AAA/year/2018") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.OK
responseAs[Institution] mustBe InstitutionConverter.convert(instA, Seq("aaa.com", "bbb.com"))
responseAs[Institution].emailDomains mustBe Seq("aaa.com", "bbb.com")
}
}

"search by email domain" in {
Get("/institutions/year/2018?domain=xxx.com") ~> institutionPublicRoutes ~> check {
Get("/institutions?domain=xxx.com") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.NotFound
}
Get("/institutions/year/2018?domain=bbb.com") ~> institutionPublicRoutes ~> check {
Get("/institutions?domain=bbb.com") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.OK
responseAs[InstitutionsResponse].institutions.size mustBe 2
}
}

"search by fields values" in {
Get("/institutions/year/2018?domain=aaa.com&lei=AAA&respondentName=RespA&taxId=taxIdA") ~> institutionPublicRoutes ~> check {
status mustBe StatusCodes.OK
val institutions = responseAs[InstitutionsResponse].institutions
institutions.size mustBe 1
institutions.head.LEI mustBe "AAA"
institutions.head.taxId mustBe Some("taxIdA")
institutions.head.respondent.name mustBe Some("RespA")
institutions.head.emailDomains mustBe List("aaa.com", "bbb.com")
}

Get("/institutions/year/2018?domain=xxx.com&lei=XXX&respondentName=RespX&taxId=taxIdX") ~> institutionPublicRoutes ~> check {
status mustBe StatusCodes.NotFound
}
}

"search by institution" in {
Get("/institutions?domain=aaa.com") ~> institutionPublicRoutes ~> check {
Get("/institutions?domain=aaa.com") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.OK
}

Get("/institutions?domain=aaa.com&lei=AAA&respondentName=RespA&taxId=taxIdA") ~> institutionPublicRoutes ~> check {
Get("/institutions?domain=aaa.com&lei=AAA&respondentName=RespA&taxId=taxIdA") ~> institutionPublicRoutes(oAuth2Authorization) ~> check {
status mustBe StatusCodes.OK
}
}
Expand Down
2 changes: 2 additions & 0 deletions kubernetes/institutions-api/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ spec:
- configMapRef:
name: {{ template "institutions-api.fullname" . }}-config
env:
- name: HMDA_RUNTIME_MODE
value: {{ .Values.hmda.runtimeMode }}
- name: KAFKA_INSTITUTIONS_TOPIC
value: {{.Values.kafka.institutionsTopic}}
- name: KAFKA_INSTITUTIONS_GROUP
Expand Down
3 changes: 2 additions & 1 deletion kubernetes/institutions-api/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ service:
account:
name: hmda-platform-irsa

#currentYear: 2018
hmda:
runtimeMode: kubernetes

kafka:
institutionsGroup: institutions-group
Expand Down
Loading