Skip to content

Commit a9fd899

Browse files
committed
Add batch ULI validation (csv)
1 parent 7f6806a commit a9fd899

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ 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)
9+
case class ULIBatchValidated(uli: String, isValid: Boolean) {
10+
def toCSV: String = s"$uli,$isValid"
11+
}
1012
case class ULIBatchValidatedResponse(ulis: Seq[ULIBatchValidated])
1113
}

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

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@ package hmda.api.http.public
33
import akka.actor.ActorSystem
44
import akka.event.LoggingAdapter
55
import akka.stream.ActorMaterializer
6-
import akka.util.Timeout
6+
import akka.util.{ ByteString, Timeout }
77
import hmda.api.http.HmdaCustomDirectives
88
import akka.http.scaladsl.server.Directives._
99
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
13+
import akka.http.scaladsl.model.{ HttpCharsets, HttpEntity, StatusCodes }
14+
import akka.http.scaladsl.model.MediaTypes.`text/csv`
15+
import akka.stream.scaladsl.{ Sink, Source }
1516
import hmda.api.protocol.processing.ApiErrorProtocol
1617
import hmda.api.protocol.public.ULIProtocol
1718
import hmda.api.util.FlowUtils
18-
1919
import scala.concurrent.ExecutionContext
2020
import scala.util.{ Failure, Success }
2121

@@ -54,12 +54,7 @@ trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ApiE
5454
} ~
5555
fileUpload("file") {
5656
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)
57+
val validatedF = processUliFile(byteSource).runWith(Sink.seq)
6358

6459
onComplete(validatedF) {
6560
case Success(validated) =>
@@ -73,8 +68,32 @@ trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ApiE
7368
complete(ToResponseMarshallable(StatusCodes.BadRequest))
7469
}
7570
}
71+
} ~
72+
path("validate" / "csv") {
73+
timedPost { _ =>
74+
fileUpload("file") {
75+
case (_, byteSource) =>
76+
val validated = processUliFile(byteSource)
77+
.map(u => u.toCSV)
78+
.map(l => l + "\n")
79+
.map(s => ByteString(s))
80+
81+
complete(HttpEntity.Chunked.fromData(`text/csv`.toContentType(HttpCharsets.`UTF-8`), validated))
82+
83+
case _ =>
84+
complete(ToResponseMarshallable(StatusCodes.BadRequest))
85+
}
86+
}
7687
}
7788
}
7889
}
7990
}
91+
92+
private def processUliFile(byteSource: Source[ByteString, Any]) = {
93+
byteSource
94+
.via(framing)
95+
.map(_.utf8String)
96+
.map(uli => (uli, validateULI(uli)))
97+
.map(validated => ULIBatchValidated(validated._1, validated._2))
98+
}
8099
}

0 commit comments

Comments
 (0)