@@ -65,11 +65,13 @@ import Data.Set as Set
65import Data.Traversable (traverse)
65import Data.Traversable (traverse)
66import Data.Tuple.Nested (type (/\), (/\))
66import Data.Tuple.Nested (type (/\), (/\))
67import Data.URL (URL, addSegment)
67import Data.URL (URL, addSegment)
68import Effect.Aff (Aff, bracket, error, throwError)
69import Effect.Aff (Aff, bracket, error, throwError)
69import Effect.Aff.HTTP (Method(..), fetch)
70import Effect.Aff.HTTP (Method(..), fetch)
70import Effect.Aff.HTTP.Request as Request
71import Effect.Aff.HTTP.Request as Request
71import Effect.Aff.HTTP.Response (Response)
72import Effect.Aff.HTTP.Response (Response)
72import Effect.Aff.HTTP.Response as Response
73import Effect.Aff.HTTP.Response as Response
74+import Effect.Class.Console (log)
73import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
75import Foreign (Foreign, unsafeFromForeign, unsafeToForeign)
74import Foreign.Object (Object)
76import Foreign.Object (Object)
75import Foreign.Object as Object
77import Foreign.Object as Object
@@ -92,7 +94,7 @@ data Expr
93instance EncodeJson Expr where
95instance EncodeJson Expr where
94 encodeJson = case _ of
96 encodeJson = case _ of
95− Lit l -> l
97+ Lit l -> encodeJson l
96 Join x y -> encodeJson { join: [ x, y ] }
98 Join x y -> encodeJson { join: [ x, y ] }
97 Union x y -> encodeJson { union: [ x, y ] }
99 Union x y -> encodeJson { union: [ x, y ] }
98 Project proj expr -> encodeJson { proj: { proj: proj, expr: expr } }
100 Project proj expr -> encodeJson { proj: { proj: proj, expr: expr } }
@@ -116,8 +118,14 @@ class LiteralRelation r fields | r -> fields where
116instance (RowList.RowToList fields fields', Relatable fields fields') => LiteralRelation (Array (Record fields)) fields where
118instance (RowList.RowToList fields fields', Relatable fields fields') => LiteralRelation (Array (Record fields)) fields where
117 lit r = Rel $ Lit $ encodeJson { lit: { attrs: attributeTypes @fields @fields', vals: encodeRelation @fields @fields' <$> r } }
119 lit r = Rel $ Lit $ encodeJson { lit: { attrs: attributeTypes @fields @fields', vals: encodeRelation @fields @fields' <$> r } }
122+ ( Newtype r (Record fields)
123+ , LiteralRelation (Array (Record field)) fields
124+ , RowToList fields fields'
125+ , Relatable fields fields'
119−else instance (LiteralRelation (Record fields) fields, Newtype r (Record fields)) => LiteralRelation r fields where
127+ LiteralRelation (Array r) fields where
120− lit = unwrap >>> lit
128+ lit = map unwrap >>> lit
122rel :: forall @rel fields. Newtype rel (Record fields) => RelVar rel => Rel fields
130rel :: forall @rel fields. Newtype rel (Record fields) => RelVar rel => Rel fields
123rel = Rel $ RelationVariable (relVar @rel)
131rel = Rel $ RelationVariable (relVar @rel)
@@ -474,7 +482,7 @@ define
474 => Transaction Unit
482 => Transaction Unit
475define = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
483define = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
476 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
484 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
477− { body: Request.json { define: { name: relVar @rel, attrs: Object.fromFoldable (attributeTypes @fields @fields') } } }
485+ { body: Request.json $ jsonToForeign $ encodeJson { define: { name: relVar @rel, attrs: attributeTypes @fields @fields' } } }
478 >>= Response.guardStatusOk
486 >>= Response.guardStatusOk
479 pure unit
487 pure unit
@@ -485,8 +493,9 @@ insert
485 => Rel fields
493 => Rel fields
486 -> Transaction Unit
494 -> Transaction Unit
487insert (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
495insert (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
496+ traceM $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } }
488 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
497 fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
489− { body: Request.json { insert: { name: relVar @rel, rel: jsonToForeign (encodeJson r) } } }
498+ { body: Request.json $ jsonToForeign $ encodeJson { insert: { name: relVar @rel, rel: r } } }
490 >>= Response.guardStatusOk
499 >>= Response.guardStatusOk
491 pure unit
500 pure unit
@@ -498,7 +507,7 @@ query
498 -> Transaction (Array (Record fields))
507 -> Transaction (Array (Record fields))
499query (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
508query (Rel r) = Transaction $ ReaderT $ \{ conn: Connection c, sess } -> do
500 resp <- fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
509 resp <- fetch POST (c `addSegment` "transaction" `addSegment` sessionString sess)
501− { body: Request.json { query: jsonToForeign (encodeJson r) } }
510+ { body: Request.json $ jsonToForeign $ encodeJson { query: r } }
502 Response.guardStatusOk resp
511 Response.guardStatusOk resp
503 j <- json resp
512 j <- json resp
504 case decodeRelation @fields @fields' j of
513 case decodeRelation @fields @fields' j of
@@ -510,7 +519,8 @@ decodeRelation
510 . BuildRelation fields fields'
519 . BuildRelation fields fields'
512 -> Either JsonDecodeError (Array (Record fields))
521 -> Either JsonDecodeError (Array (Record fields))
522+decodeRelation j = do
513−decodeRelation j = decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
523+ decodeRelationJson j >>= traverse (decodeRelationFromObject @fields @fields')
515jsonToForeign :: Json -> Foreign
525jsonToForeign :: Json -> Foreign
516jsonToForeign = unsafeCoerce
526jsonToForeign = unsafeCoerce