@@ -3,19 +3,19 @@ package hmda.api.http.public
33import akka .actor .ActorSystem
44import akka .event .LoggingAdapter
55import akka .stream .ActorMaterializer
6- import akka .util .Timeout
6+ import akka .util .{ ByteString , Timeout }
77import hmda .api .http .HmdaCustomDirectives
88import akka .http .scaladsl .server .Directives ._
99import hmda .api .model .public .ULIModel ._
1010import hmda .validation .engine .lar .ULI ._
1111import akka .http .scaladsl .marshallers .sprayjson .SprayJsonSupport ._
1212import 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 }
1516import hmda .api .protocol .processing .ApiErrorProtocol
1617import hmda .api .protocol .public .ULIProtocol
1718import hmda .api .util .FlowUtils
18-
1919import scala .concurrent .ExecutionContext
2020import 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