@@ -3,19 +3,19 @@ package hmda.api.http.public
3
3
import akka .actor .ActorSystem
4
4
import akka .event .LoggingAdapter
5
5
import akka .stream .ActorMaterializer
6
- import akka .util .Timeout
6
+ import akka .util .{ ByteString , Timeout }
7
7
import hmda .api .http .HmdaCustomDirectives
8
8
import akka .http .scaladsl .server .Directives ._
9
9
import hmda .api .model .public .ULIModel ._
10
10
import hmda .validation .engine .lar .ULI ._
11
11
import akka .http .scaladsl .marshallers .sprayjson .SprayJsonSupport ._
12
12
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 }
15
16
import hmda .api .protocol .processing .ApiErrorProtocol
16
17
import hmda .api .protocol .public .ULIProtocol
17
18
import hmda .api .util .FlowUtils
18
-
19
19
import scala .concurrent .ExecutionContext
20
20
import scala .util .{ Failure , Success }
21
21
@@ -54,12 +54,7 @@ trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ApiE
54
54
} ~
55
55
fileUpload(" file" ) {
56
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)
57
+ val validatedF = processUliFile(byteSource).runWith(Sink .seq)
63
58
64
59
onComplete(validatedF) {
65
60
case Success (validated) =>
@@ -73,8 +68,32 @@ trait PublicHttpApi extends PublicLarHttpApi with HmdaCustomDirectives with ApiE
73
68
complete(ToResponseMarshallable (StatusCodes .BadRequest ))
74
69
}
75
70
}
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
+ }
76
87
}
77
88
}
78
89
}
79
90
}
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
+ }
80
99
}
0 commit comments