Commit 3c85f903 authored by Alexandre Delanoë's avatar Alexandre Delanoë

[ERRORS] Handling: adding some errors in DB.

parent b5d6e997
Pipeline #92 canceled with stage
...@@ -269,16 +269,23 @@ graphAPI nId = do ...@@ -269,16 +269,23 @@ graphAPI nId = do
instance HasNodeError ServantErr where instance HasNodeError ServantErr where
_NodeError = prism' mk (const $ panic "HasNodeError ServantErr: not a prism") _NodeError = prism' mk (const $ panic "HasNodeError ServantErr: not a prism")
where where
mk NoListFound = err404 { errBody = "NodeError: No list found" } e = "NodeError: "
mk MkNodeError = err404 { errBody = "NodeError: Cannot mk node" } mk NoListFound = err404 { errBody = e <> "No list found" }
mk MkNode = err500 { errBody = e <> "Cannot mk node" }
mk NegativeId = err500 { errBody = e <> "Node Id non positive" }
mk UserNoParent= err500 { errBody = e <> "Should not have parent"}
mk HasParent = err500 { errBody = e <> "NodeType has parent" }
mk NotImplYet = err500 { errBody = e <> "Not implemented yet" }
mk ManyParents = err500 { errBody = e <> "Too many parents" }
-- TODO(orphan): There should be a proper APIError data type with a case TreeError. -- TODO(orphan): There should be a proper APIError data type with a case TreeError.
instance HasTreeError ServantErr where instance HasTreeError ServantErr where
_TreeError = prism' mk (const $ panic "HasTreeError ServantErr: not a prism") _TreeError = prism' mk (const $ panic "HasTreeError ServantErr: not a prism")
where where
mk NoRoot = err404 { errBody = "Root node not found" } e = "TreeError: "
mk EmptyRoot = err500 { errBody = "Root node should not be empty" } mk NoRoot = err404 { errBody = e <> "Root node not found" }
mk TooManyRoots = err500 { errBody = "Too many root nodes" } mk EmptyRoot = err500 { errBody = e <> "Root node should not be empty" }
mk TooManyRoots = err500 { errBody = e <> "Too many root nodes" }
type TreeAPI = Get '[JSON] (Tree NodeTree) type TreeAPI = Get '[JSON] (Tree NodeTree)
treeAPI :: NodeId -> GargServer TreeAPI treeAPI :: NodeId -> GargServer TreeAPI
......
...@@ -50,7 +50,13 @@ import Prelude hiding (null, id, map, sum) ...@@ -50,7 +50,13 @@ import Prelude hiding (null, id, map, sum)
------------------------------------------------------------------------ ------------------------------------------------------------------------
data NodeError = NoListFound | MkNodeError data NodeError = NoListFound
| MkNode
| UserNoParent
| HasParent
| ManyParents
| NegativeId
| NotImplYet
deriving (Show) deriving (Show)
class HasNodeError e where class HasNodeError e where
...@@ -415,7 +421,7 @@ insertNodes ns = mkCmd $ \conn -> runInsertMany conn nodeTable ns ...@@ -415,7 +421,7 @@ insertNodes ns = mkCmd $ \conn -> runInsertMany conn nodeTable ns
insertNodesR :: [NodeWrite] -> Cmd err [Int] insertNodesR :: [NodeWrite] -> Cmd err [Int]
insertNodesR ns = mkCmd $ \conn -> insertNodesR ns = mkCmd $ \conn ->
runInsert_ conn (Insert nodeTable ns (rReturning (\(Node i _ _ _ _ _ __) -> i)) Nothing) runInsert_ conn (Insert nodeTable ns (rReturning (\(Node i _ _ _ _ _ _) -> i)) Nothing)
insertNodesWithParent :: Maybe ParentId -> [NodeWrite] -> Cmd err Int64 insertNodesWithParent :: Maybe ParentId -> [NodeWrite] -> Cmd err Int64
insertNodesWithParent pid ns = insertNodes (set node_parentId (pgInt4 <$> pid) <$> ns) insertNodesWithParent pid ns = insertNodes (set node_parentId (pgInt4 <$> pid) <$> ns)
...@@ -462,12 +468,12 @@ data NewNode = NewNode { _newNodeId :: Int ...@@ -462,12 +468,12 @@ data NewNode = NewNode { _newNodeId :: Int
, _newNodeChildren :: [Int] } , _newNodeChildren :: [Int] }
-- | postNode -- | postNode
postNode :: UserId -> Maybe ParentId -> Node' -> Cmd err NewNode postNode :: HasNodeError err => UserId -> Maybe ParentId -> Node' -> Cmd err NewNode
postNode uid pid (Node' nt txt v []) = do postNode uid pid (Node' nt txt v []) = do
pids <- mkNodeR [node2table uid pid (Node' nt txt v [])] pids <- mkNodeR [node2table uid pid (Node' nt txt v [])]
case pids of case pids of
[pid] -> pure $ NewNode pid [] [pid] -> pure $ NewNode pid []
_ -> panic "postNode: only one pid expected" _ -> nodeError ManyParents
postNode uid pid (Node' NodeCorpus txt v ns) = do postNode uid pid (Node' NodeCorpus txt v ns) = do
NewNode pid' _ <- postNode uid pid (Node' NodeCorpus txt v []) NewNode pid' _ <- postNode uid pid (Node' NodeCorpus txt v [])
...@@ -478,7 +484,7 @@ postNode uid pid (Node' NodeAnnuaire txt v ns) = do ...@@ -478,7 +484,7 @@ postNode uid pid (Node' NodeAnnuaire txt v ns) = do
NewNode pid' _ <- postNode uid pid (Node' NodeAnnuaire txt v []) NewNode pid' _ <- postNode uid pid (Node' NodeAnnuaire txt v [])
pids <- mkNodeR (concat $ map (\n -> [childWith uid pid' n]) ns) pids <- mkNodeR (concat $ map (\n -> [childWith uid pid' n]) ns)
pure $ NewNode pid' pids pure $ NewNode pid' pids
postNode _ _ (Node' _ _ _ _) = panic "TODO: postNode for this type not implemented yet" postNode _ _ (Node' _ _ _ _) = nodeError NotImplYet
childWith :: UserId -> ParentId -> Node' -> NodeWrite childWith :: UserId -> ParentId -> Node' -> NodeWrite
...@@ -487,7 +493,6 @@ childWith uId pId (Node' NodeContact txt v []) = node2table uId (Just pId) (Nod ...@@ -487,7 +493,6 @@ childWith uId pId (Node' NodeContact txt v []) = node2table uId (Just pId) (Nod
childWith _ _ (Node' _ _ _ _) = panic "This NodeType can not be a child" childWith _ _ (Node' _ _ _ _) = panic "This NodeType can not be a child"
mk :: NodeType -> Maybe ParentId -> Text -> Cmd err [Int] mk :: NodeType -> Maybe ParentId -> Text -> Cmd err [Int]
mk nt pId name = mk' nt userId pId name mk nt pId name = mk' nt userId pId name
where where
...@@ -500,15 +505,15 @@ mk' nt uId pId name = map fromIntegral <$> insertNodesWithParentR pId [node nt ...@@ -500,15 +505,15 @@ mk' nt uId pId name = map fromIntegral <$> insertNodesWithParentR pId [node nt
type Name = Text type Name = Text
mk'' :: NodeType -> Maybe ParentId -> UserId -> Name -> Cmd err [Int] mk'' :: HasNodeError err => NodeType -> Maybe ParentId -> UserId -> Name -> Cmd err [Int]
mk'' NodeUser Nothing uId name = mk' NodeUser uId Nothing name mk'' NodeUser Nothing uId name = mk' NodeUser uId Nothing name
mk'' NodeUser _ _ _ = panic "NodeUser do not have any parent" mk'' NodeUser _ _ _ = nodeError UserNoParent
mk'' _ Nothing _ _ = panic "NodeType does have a parent" mk'' _ Nothing _ _ = nodeError HasParent
mk'' nt pId uId name = mk' nt uId pId name mk'' nt pId uId name = mk' nt uId pId name
mkRoot :: Username -> UserId -> Cmd err [Int] mkRoot :: HasNodeError err => Username -> UserId -> Cmd err [Int]
mkRoot uname uId = case uId > 0 of mkRoot uname uId = case uId > 0 of
False -> panic "UserId <= 0" False -> nodeError NegativeId
True -> mk'' NodeUser Nothing uId uname True -> mk'' NodeUser Nothing uId uname
mkCorpus :: Maybe Name -> Maybe HyperdataCorpus -> ParentId -> UserId -> Cmd err [Int] mkCorpus :: Maybe Name -> Maybe HyperdataCorpus -> ParentId -> UserId -> Cmd err [Int]
...@@ -516,9 +521,8 @@ mkCorpus n h p u = insertNodesR [nodeCorpusW n h p u] ...@@ -516,9 +521,8 @@ mkCorpus n h p u = insertNodesR [nodeCorpusW n h p u]
getOrMkList :: HasNodeError err => ParentId -> UserId -> Cmd err Int getOrMkList :: HasNodeError err => ParentId -> UserId -> Cmd err Int
getOrMkList pId uId = getOrMkList pId uId =
defaultList pId defaultList pId `catchNodeError`
`catchNodeError` (\_ -> maybe (nodeError MkNode) pure . headMay =<< mkList pId uId)
(\_ -> maybe (nodeError MkNodeError) pure . headMay =<< mkList pId uId)
defaultList :: HasNodeError err => CorpusId -> Cmd err ListId defaultList :: HasNodeError err => CorpusId -> Cmd err ListId
defaultList cId = defaultList cId =
......
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