1 module Rakka.Resource.Users
6 import Control.Monad.Trans
8 import Network.HTTP.Lucu
9 import Rakka.Authorization
10 import Rakka.Environment
14 resUsers :: Environment -> ResourceDef
17 resUsesNativeThread = False
19 , resGet = Just $ handleGet env
22 , resPut = Just $ handlePut env
23 , resDelete = Just $ handleDelete env
38 [GET /users/nonexistent]
41 handleGet :: Environment -> Resource ()
43 = do userID <- getUserID env
44 when (isNothing userID)
45 $ abort Forbidden [] Nothing
50 [name] -> returnUser name
51 _ -> foundNoEntity Nothing
53 returnUserList :: Resource ()
55 = do users <- liftIO $ getUserList $ envAuthDB env
56 runIdempotentA' $ proc ()
57 -> do tree <- ( eelem "/"
67 returnA -< outputXml tree
69 returnUser :: String -> Resource ()
71 = do users <- liftIO $ getUserList $ envAuthDB env
72 if any (== name) users
73 then setStatus NoContent
74 else foundNoEntity Nothing
78 > PUT /users/foo HTTP/1.1
79 > Content-Type: text/plain
83 < HTTP/1.1 201 Created
85 handlePut :: Environment -> Resource ()
87 = do userID <- getUserID env
88 when (isNothing userID)
89 $ abort Forbidden [] Nothing
93 [name] -> do mimeType <- getContentType
96 -> abort BadRequest [] (Just "Missing Content-Type")
97 Just (MIMEType "text" "plain" _)
98 -> do pass <- input defaultLimit
99 addUser (envAuthDB env) name pass
101 -> abort UnsupportedMediaType [] (Just $ "Unsupported media type: " ++ show t)
103 _ -> abort BadRequest [] (Just "Invalid URI")
106 handleDelete :: Environment -> Resource ()
108 = do userID <- getUserID env
109 when (isNothing userID)
110 $ abort Forbidden [] Nothing
114 [name] -> delUser (envAuthDB env) name
115 _ -> abort BadRequest [] (Just "Invalid URI")