···44import Brain.Common.State as Common
55import Brain.Ports as Ports
66import Brain.Types exposing (..)
77+import Dict
78import Json.Decode as Json
88-import Return
99+import List.Extra as List
1010+import Return exposing (return)
911import Return.Ext as Return
1012import Sources exposing (Service(..))
1313+import Sources.Encoding
1114import Sources.Refresh.AccessToken
1215import Time
1316···2225 Ok portArguments ->
2326 case portArguments.service of
2427 Google ->
2525- -- TODO:
2626- -- 1. Find source
2727- -- 2. Add `access token` and `expires at` to source data
2828- -- 3. Replace source in collection
2929- -- 4. Save user data
3030- Return.singleton model
2828+ model.hypaethralUserData.sources
2929+ |> List.find (.id >> (==) portArguments.sourceId)
3030+ |> Maybe.map
3131+ (\source ->
3232+ source.data
3333+ |> Dict.insert "accessToken" portArguments.accessToken
3434+ |> Dict.insert "expiresAt" (String.fromInt portArguments.expiresAt)
3535+ |> (\newData -> { source | data = newData })
3636+ )
3737+ |> Maybe.map
3838+ (\source ->
3939+ source
4040+ |> Sources.Encoding.encode
4141+ |> Alien.broadcast Alien.UpdateSourceData
4242+ |> Ports.toUI
4343+ )
4444+ |> Maybe.withDefault Cmd.none
4545+ |> return model
31463247 _ ->
3348 Return.singleton model
+7-5
src/Javascript/Workers/service.js
···13131414const EXCLUDE =
1515 [ "_headers"
1616- , "_redirects"
1717- , "CORS"
1616+ , "_redirects"
1717+ , "CORS"
1818 ]
19192020···7979 "Basic " + token
8080 )
81818282- // When doing a request with access token in the url, put it in the headers instead
8282+ // When doing a request with access token in the url, put it in the headers instead
8383 } else if (event.request.url.includes("bearer_token=")) {
8484 const url = new URL(event.request.url)
8585 const token = url.searchParams.get("bearer_token")
···9595 "Bearer " + token
9696 )
97979898- // Use cache if internal request and not using native app
9898+ // Use cache if internal request and not using native app
9999 } else if (isInternal) {
100100 event.respondWith(
101101 isNativeWrapper
···152152 request.headers.entries()
153153 )
154154155155- newHeaders["authorization"] = authToken
155155+ newHeaders[ "authorization" ] = authToken
156156157157 const newRequest = new Request(
158158 new Request(urlWithoutToken, event.request),
···170170171171 let retries = 0
172172173173+ // TODO: When request fails because access token is expired,
174174+ // refresh the token, and retry the request.
173175 const makeFetch = () => fetch(newRequest).then(r => {
174176 if (r.ok) {
175177 retries = 0