Skip to content

Commit 7f6806a

Browse files
committed
Add batch ULI validation (json)
1 parent ad908c2 commit 7f6806a

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

api-model/src/main/scala/hmda/api/model/public/ULIModel.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ object ULIModel {
66
case class ULI(loanId: String, checkDigit: Int, uli: String)
77
case class ULICheck(uli: String)
88
case class ULIValidated(isValid: Boolean)
9+
case class ULIBatchValidated(uli: String, isValid: Boolean)
10+
case class ULIBatchValidatedResponse(ulis: Seq[ULIBatchValidated])
911
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package hmda.api.protocol.public
22

3-
import hmda.api.model.public.ULIModel.{ Loan, ULI, ULICheck, ULIValidated }
3+
import hmda.api.model.public.ULIModel._
44
import spray.json.DefaultJsonProtocol
55

66
trait ULIProtocol extends DefaultJsonProtocol {
77

88
implicit val loanFormat = jsonFormat1(Loan.apply)
99
implicit val uliFormat = jsonFormat3(ULI.apply)
1010
implicit val uliCheckFormat = jsonFormat1(ULICheck.apply)
11-
implicit val uliValidated = jsonFormat1(ULIValidated.apply)
11+
implicit val uliValidatedFormat = jsonFormat1(ULIValidated.apply)
12+
implicit val uliBatchValidatedFormat = jsonFormat2(ULIBatchValidated.apply)
13+
implicit val uliBatchValidatedResponseFormat = jsonFormat1(ULIBatchValidatedResponse.apply)
1214

1315
}

api/src/main/scala/hmda/api/http/public/PublicHttpApi.scala

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@ import akka.stream.ActorMaterializer
66
import akka.util.Timeout
77
import hmda.api.http.HmdaCustomDirectives
88
import akka.http.scaladsl.server.Directives._
9-
import hmda.api.model.public.ULIModel.{ Loan, ULI, ULICheck, ULIValidated }
9+
import hmda.api.model.public.ULIModel._
1010
import hmda.validation.engine.lar.ULI._
1111
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
1212
import akka.http.scaladsl.marshalling.ToResponseMarshallable
13+
import akka.http.scaladsl.model.StatusCodes
14+
import akka.stream.scaladsl.Sink
15+
import hmda.api.protocol.processing.ApiErrorProtocol
1316
import hmda.api.protocol.public.ULIProtocol
17+
import hmda.api.util.FlowUtils
1418

1519
import scala.concurrent.ExecutionContext
20+
import scala.util.{ Failure, Success }
1621

17-
trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ULIProtocol {
22+
trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ApiErrorProtocol with ULIProtocol with FlowUtils {
1823
implicit val system: ActorSystem
1924
implicit val materializer: ActorMaterializer
2025
implicit val timeout: Timeout
@@ -46,7 +51,27 @@ trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ULIP
4651
val isValid = validateULI(uli)
4752
val validated = ULIValidated(isValid)
4853
complete(ToResponseMarshallable(validated))
49-
}
54+
} ~
55+
fileUpload("file") {
56+
case (_, byteSource) =>
57+
val validatedF = byteSource
58+
.via(framing)
59+
.map(_.utf8String)
60+
.map(uli => (uli, validateULI(uli)))
61+
.map(validated => ULIBatchValidated(validated._1, validated._2))
62+
.runWith(Sink.seq)
63+
64+
onComplete(validatedF) {
65+
case Success(validated) =>
66+
complete(ToResponseMarshallable(ULIBatchValidatedResponse(validated)))
67+
case Failure(error) =>
68+
log.error(error.getLocalizedMessage)
69+
complete(ToResponseMarshallable(StatusCodes.InternalServerError))
70+
}
71+
72+
case _ =>
73+
complete(ToResponseMarshallable(StatusCodes.BadRequest))
74+
}
5075
}
5176
}
5277
}

0 commit comments

Comments
 (0)