Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit b236b60

Browse files
committed
handler: implement DELETE
1 parent 297375e commit b236b60

File tree

2 files changed

+62
-6
lines changed

2 files changed

+62
-6
lines changed

infra/handler/app/Test.hs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,33 @@ main = do
5757
Right slides ->
5858
if slides == [WithId slideId updatedSlide] then pure () else (error $ "Expected updated slides, got: " <> show slides)
5959

60+
runClientM (slidesDelete' slideId) clientEnv >>= \case
61+
Left err -> error $ "Expected slide delete, got error: " <> show err
62+
Right {} -> pure ()
63+
64+
runClientM slidesGet' clientEnv >>= \case
65+
Left err -> error $ "Expected no slides, got error: " <> show err
66+
Right slides ->
67+
if slides == [] then pure () else (error $ "Expected no slides, got: " <> show slides)
68+
69+
runClientM (decksDelete' deckId) clientEnv >>= \case
70+
Left err -> error $ "Expected deck delete, got error: " <> show err
71+
Right {} -> pure ()
72+
73+
runClientM decksGet' clientEnv >>= \case
74+
Left err -> error $ "Expected no decks, got error: " <> show err
75+
Right decks ->
76+
if decks == [] then pure () else (error $ "Expected no decks, got: " <> show decks)
77+
6078
-- 'client' allows you to produce operations to query an API from a client.
6179
decksGet' :: ClientM [WithId DeckId Deck]
6280
decksPost' :: Deck -> ClientM (WithId DeckId Deck)
6381
decksPut' :: DeckId -> Deck -> ClientM (WithId DeckId Deck)
82+
decksDelete' :: DeckId -> ClientM ()
6483
slidesGet' :: ClientM [WithId SlideId Slide]
6584
slidesPost' :: Slide -> ClientM (WithId SlideId Slide)
6685
slidesPut' :: SlideId -> Slide -> ClientM (WithId SlideId Slide)
67-
((decksGet' :<|> decksPost' :<|> decksPut') :<|>
68-
(slidesGet' :<|> slidesPost' :<|> slidesPut')
86+
slidesDelete' :: SlideId -> ClientM ()
87+
((decksGet' :<|> decksPost' :<|> decksPut' :<|> decksDelete') :<|>
88+
(slidesGet' :<|> slidesPost' :<|> slidesPut' :<|> slidesDelete')
6989
) = client api

infra/handler/src/DeckGo/Handler.hs

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,14 @@ type API =
109109
type DecksAPI =
110110
Get '[JSON] [WithId DeckId Deck] :<|>
111111
ReqBody '[JSON] Deck :> Post '[JSON] (WithId DeckId Deck) :<|>
112-
Capture "deck_id" DeckId :> ReqBody '[JSON] Deck :> Put '[JSON] (WithId DeckId Deck)
112+
Capture "deck_id" DeckId :> ReqBody '[JSON] Deck :> Put '[JSON] (WithId DeckId Deck) :<|>
113+
Capture "deck_id" DeckId :> Delete '[JSON] ()
113114

114115
type SlidesAPI =
115116
Get '[JSON] [WithId SlideId Slide] :<|>
116117
ReqBody '[JSON] Slide :> Post '[JSON] (WithId SlideId Slide) :<|>
117-
Capture "slide_id" SlideId :> ReqBody '[JSON] Slide :> Put '[JSON] (WithId SlideId Slide)
118+
Capture "slide_id" SlideId :> ReqBody '[JSON] Slide :> Put '[JSON] (WithId SlideId Slide) :<|>
119+
Capture "slide_id" SlideId :> Delete '[JSON] ()
118120

119121
api :: Proxy API
120122
api = Proxy
@@ -129,8 +131,16 @@ application env = Servant.serve api (server env)
129131
server :: Aws.Env -> Servant.Server API
130132
server env = serveDecks :<|> serveSlides
131133
where
132-
serveDecks = decksGet env :<|> decksPost env :<|> decksPut env
133-
serveSlides = slidesGet env :<|> slidesPost env :<|> slidesPut env
134+
serveDecks =
135+
decksGet env :<|>
136+
decksPost env :<|>
137+
decksPut env :<|>
138+
decksDelete env
139+
serveSlides =
140+
slidesGet env :<|>
141+
slidesPost env :<|>
142+
slidesPut env :<|>
143+
slidesDelete env
134144

135145
decksGet :: Aws.Env -> Servant.Handler [WithId DeckId Deck]
136146
decksGet env = do
@@ -180,6 +190,19 @@ decksPut env deckId deck = do
180190

181191
pure $ WithId deckId deck
182192

193+
decksDelete :: Aws.Env -> DeckId -> Servant.Handler ()
194+
decksDelete env deckId = do
195+
196+
res <- runAWS env $ Aws.send $ DynamoDB.deleteItem "Decks" &
197+
DynamoDB.diKey .~ HMS.singleton "DeckId"
198+
(deckIdToAttributeValue deckId)
199+
200+
case res of
201+
Right {} -> pure ()
202+
Left e -> do
203+
liftIO $ print e
204+
Servant.throwError Servant.err500
205+
183206
runAWS :: MonadIO m => Aws.Env -> Aws.AWS a -> m (Either SomeException a)
184207
runAWS env =
185208
liftIO .
@@ -238,6 +261,19 @@ slidesPut env slideId slide = do
238261

239262
pure $ WithId slideId slide
240263

264+
slidesDelete :: Aws.Env -> SlideId -> Servant.Handler ()
265+
slidesDelete env slideId = do
266+
267+
res <- runAWS env $ Aws.send $ DynamoDB.deleteItem "Slides" &
268+
DynamoDB.diKey .~ HMS.singleton "SlideId"
269+
(slideIdToAttributeValue slideId)
270+
271+
case res of
272+
Right x -> liftIO $ print x
273+
Left e -> do
274+
liftIO $ print e
275+
Servant.throwError Servant.err500
276+
241277
randomString :: Int -> [Char] -> IO String
242278
randomString len allowedChars =
243279
replicateM len $ do

0 commit comments

Comments
 (0)