Commit a2455155 authored by Przemyslaw Kaminski's avatar Przemyslaw Kaminski

[Tree] use multipart form data for async file upload

parent 555516cd
...@@ -17,7 +17,7 @@ import Web.File.FileReader.Aff (readAsText) ...@@ -17,7 +17,7 @@ import Web.File.FileReader.Aff (readAsText)
import Gargantext.Components.Forest.Tree.Node.Action import Gargantext.Components.Forest.Tree.Node.Action
import Gargantext.Routes (SessionRoute(..)) import Gargantext.Routes (SessionRoute(..))
import Gargantext.Sessions (Session, postWwwUrlencoded) import Gargantext.Sessions (Session, postWwwUrlencoded, postMultipartFormData)
import Gargantext.Types (class ToQuery, toQuery, NodeType(..), AsyncTask(..)) import Gargantext.Types (class ToQuery, toQuery, NodeType(..), AsyncTask(..))
import Gargantext.Utils (id) import Gargantext.Utils (id)
import Gargantext.Utils.Reactix as R2 import Gargantext.Utils.Reactix as R2
...@@ -169,7 +169,8 @@ instance fileUploadQueryToQuery :: ToQuery FileUploadQuery where ...@@ -169,7 +169,8 @@ instance fileUploadQueryToQuery :: ToQuery FileUploadQuery where
uploadFile :: Session -> ID -> FileType -> UploadFileContents -> Aff AsyncTask uploadFile :: Session -> ID -> FileType -> UploadFileContents -> Aff AsyncTask
uploadFile session id fileType (UploadFileContents fileContents) = uploadFile session id fileType (UploadFileContents fileContents) =
postWwwUrlencoded session p fileContents --postWwwUrlencoded session p fileContents
postMultipartFormData session p fileContents
where where
q = FileUploadQuery { fileType: fileType } q = FileUploadQuery { fileType: fileType }
p = NodeAPI Corpus (Just id) $ "add/file/async" <> Q.print (toQuery q) p = NodeAPI Corpus (Just id) $ "add/file/async" <> Q.print (toQuery q)
module Gargantext.Config.REST where module Gargantext.Config.REST where
import Prelude (Unit, bind, pure, ($), (<$>), (<<<), (<>))
import Affjax (defaultRequest, printResponseFormatError, request) import Affjax (defaultRequest, printResponseFormatError, request)
import Affjax.RequestBody (RequestBody(..), string) import Affjax.RequestBody (RequestBody(..), formData, formURLEncoded, string)
import Affjax.RequestHeader (RequestHeader(..)) import Affjax.RequestHeader (RequestHeader(..))
import Affjax.ResponseFormat as ResponseFormat import Affjax.ResponseFormat as ResponseFormat
import Effect.Class (liftEffect) import DOM.Simple.Console (log)
import Data.Argonaut (class DecodeJson, decodeJson, class EncodeJson, encodeJson) import Data.Argonaut (class DecodeJson, decodeJson, class EncodeJson, encodeJson)
import Data.Either (Either(..)) import Data.Either (Either(..))
import Data.Foldable (foldMap)
import Data.FormURLEncoded as FormURLEncoded
import Data.HTTP.Method (Method(..)) import Data.HTTP.Method (Method(..))
import Data.Maybe (Maybe(..)) import Data.Maybe (Maybe(..))
import Data.MediaType.Common (applicationFormURLEncoded, applicationJSON) import Data.MediaType.Common (applicationFormURLEncoded, applicationJSON, multipartFormData)
import Data.Foldable (foldMap) import Data.Tuple (Tuple(..))
import DOM.Simple.Console (log)
import Effect.Aff (Aff, throwError) import Effect.Aff (Aff, throwError)
import Effect.Class (liftEffect)
import Effect.Exception (error) import Effect.Exception (error)
import Prelude (Unit, bind, pure, ($), (<$>), (<<<), (<>))
import Web.XHR.FormData as XHRFormData
type Token = String type Token = String
...@@ -80,7 +82,7 @@ postWwwUrlencoded mtoken url body = do ...@@ -80,7 +82,7 @@ postWwwUrlencoded mtoken url body = do
foldMap (\token -> foldMap (\token ->
[RequestHeader "Authorization" $ "Bearer " <> token] [RequestHeader "Authorization" $ "Bearer " <> token]
) mtoken ) mtoken
, content = Just $ string body , content = Just $ formURLEncoded urlEncodedBody
} }
case affResp.body of case affResp.body of
Left err -> do Left err -> do
...@@ -93,3 +95,30 @@ postWwwUrlencoded mtoken url body = do ...@@ -93,3 +95,30 @@ postWwwUrlencoded mtoken url body = do
case decodeJson json of case decodeJson json of
Left err -> throwError $ error $ "decodeJson affResp.body: " <> err Left err -> throwError $ error $ "decodeJson affResp.body: " <> err
Right b -> pure b Right b -> pure b
where
urlEncodedBody = FormURLEncoded.fromArray [Tuple "body" (Just body)]
postMultipartFormData :: forall b. DecodeJson b => Maybe Token -> String -> String -> Aff b
postMultipartFormData mtoken url body = do
fd <- liftEffect $ XHRFormData.new
_ <- liftEffect $ XHRFormData.append (XHRFormData.EntryName "body") body fd
affResp <- request $ defaultRequest
{ url = url
, responseFormat = ResponseFormat.json
, method = Left POST
, headers = [ ContentType multipartFormData
, Accept applicationJSON
] <>
foldMap (\token ->
[ RequestHeader "Authorization" $ "Bearer " <> token ]
) mtoken
, content = Just $ formData fd
}
case affResp.body of
Left err -> do
_ <- liftEffect $ log $ printResponseFormatError err
throwError $ error $ printResponseFormatError err
Right json -> do
case decodeJson json of
Left err -> throwError $ error $ "decodeJson affResp.body: " <> err
Right b -> pure b
...@@ -226,5 +226,8 @@ post session@(Session {token}) p = REST.post (Just token) (toUrl session p) ...@@ -226,5 +226,8 @@ post session@(Session {token}) p = REST.post (Just token) (toUrl session p)
postWwwUrlencoded :: forall b p. DecodeJson b => ToUrl Session p => Session -> p -> String -> Aff b postWwwUrlencoded :: forall b p. DecodeJson b => ToUrl Session p => Session -> p -> String -> Aff b
postWwwUrlencoded session@(Session {token}) p = REST.postWwwUrlencoded (Just token) (toUrl session p) postWwwUrlencoded session@(Session {token}) p = REST.postWwwUrlencoded (Just token) (toUrl session p)
postMultipartFormData :: forall b p. DecodeJson b => ToUrl Session p => Session -> p -> String -> Aff b
postMultipartFormData session@(Session {token}) p = REST.postMultipartFormData (Just token) (toUrl session p)
getls :: Effect Storage getls :: Effect Storage
getls = window >>= localStorage getls = window >>= localStorage
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment