@@ -14,18 +14,22 @@ module Supabase.Supabase
1414 , SessionData
1515 , SignInOptions
1616 , StatusR
17+ , class Or
1718 , User
1819 , class Equals
1920 , class Select
2021 , delete
2122 , equals
23+ , channel
2224 , from
2325 , getSession
2426 , invoke
2527 , maybeSingle
2628 , onAuthStateChange
29+ , or
2730 , range
2831 , select
32+ , getUser
2933 , signInWithOtp
3034 , signInWithOtpOptions
3135 , signOut
@@ -37,26 +41,28 @@ module Supabase.Supabase
3741import Prelude
3842
3943import Control.Promise (Promise)
40−import Control.Promise as Promise
44+import Data.Either (Either(..))
4145import Data.Function.Uncurried (Fn2, Fn3, runFn2, runFn3)
42−import Data.Maybe (Maybe)
46+import Data.Maybe (Maybe(..))
4347import Data.Nullable (Nullable)
44−import Data.Nullable as Nullable
4548import Data.Tuple (Tuple(..))
4649import Effect (Effect)
4750import Effect.Aff (Aff, Error)
51+import Effect.Exception (error)
4852import Effect.Uncurried (EffectFn1, EffectFn3, mkEffectFn1, runEffectFn3)
49−import Fetch as Fetch
50−import Fetch.Core.Response as YogaJson.Core
51−import Fetch.Internal.Response as FetchInternalResponse
5253import Foreign (Foreign)
5354import Prim.Row (class Union)
54−import Supabase.Types (Client)
55−import Supabase.Util as Util
55+import Supabase.Types (Channel, ChannelName, Client)
5656import Type.Function (type ($))
5757import Type.Row (type (+))
58−import Yoga.JSON (class ReadForeign, class WriteForeign, write) as YogaJson
5958import Yoga.JSON (class ReadForeign, class WriteForeign, writeImpl)
59+import Fetch as Fetch
60+import Fetch.Internal.Response as FetchInternalResponse
61+import Data.Nullable as Nullable
62+import Control.Promise as Promise
63+import Supabase.Util as Util
64+import Yoga.JSON (class ReadForeign, class WriteForeign, write) as YogaJson
65+import Fetch.Core.Response as YogaJson.Core
6066
6167foreign import data QueryBuilder :: Type
6268foreign import data FilterBuilder :: Type
@@ -123,6 +129,18 @@ else instance (YogaJson.ReadForeign output) => Equals FilterBuilder (Aff output)
123129 equals :: String -> String -> FilterBuilder -> Aff output
124130 equals l r builder = runFn2 (eqRunImpl builder) l r # Promise.toAffE >>= Util.fromJSON
125131
132+foreign import orImpl :: forall builderIn builderOut. Array String -> builderIn -> builderOut
133+
134+class Or builder output | output -> builder where
135+ or :: Array String -> builder -> output
136+
137+instance Or FilterBuilder FilterBuilder where
138+ or :: Array String -> FilterBuilder -> FilterBuilder
139+ or keys fb = orImpl keys fb
140+else instance Or QueryBuilder FilterBuilder where
141+ or :: Array String -> QueryBuilder -> FilterBuilder
142+ or keys fb = orImpl keys fb
143+
126144foreign import singleImpl :: FilterBuilder -> Effect (Promise Foreign)
127145
128146single :: forall t. YogaJson.ReadForeign t => FilterBuilder -> Aff (Response t)
@@ -169,7 +187,7 @@ foreign import onAuthStateChangeImpl :: Client -> (EffectFn1 (Nullable Session)
169187onAuthStateChange ∷ Client → (Maybe Session → Effect Unit) → Effect { data :: { id :: String, unsubscribe :: Effect Unit } }
170188onAuthStateChange client handler = onAuthStateChangeImpl client $ mkEffectFn1 (Nullable.toMaybe >>> handler)
171189
172−type User = { id :: String, email :: String }
190+type User = { id :: String, email :: String, user_metadata :: Foreign }
173191type Session = { user :: User }
174192type SessionData = { session :: Maybe Session }
175193
@@ -200,3 +218,15 @@ invoke client fn body headers = runFn3 (invokeImpl client) fn body headers # Pro
200218 where
201219 convertError { message, context } = { message, context: FetchInternalResponse.convert context }
202220 convert { "data": d, error } = { "data": Nullable.toMaybe d, error: Nullable.toMaybe error <#> convertError }
221+
222+foreign import channel :: ChannelName -> Client -> Effect Channel
223+
224+foreign import getUserImpl :: Client -> Effect (Promise { data :: Nullable User, error :: Nullable Error })
225+
226+getUser :: Client -> Aff (Either Error User)
227+getUser client = do
228+ res <- getUserImpl client # Promise.toAffE
229+ case Nullable.toMaybe res.data, Nullable.toMaybe res.error of
230+ Just user, _ -> pure $ Right user
231+ _, Just error -> pure $ Left error
232+ _, _ -> pure $ Left (error "Unexpected response error")