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

Commit b3ead8a

Browse files
committed
handler: get decks and slides by id
1 parent 7b78019 commit b3ead8a

File tree

2 files changed

+82
-2
lines changed

2 files changed

+82
-2
lines changed

infra/handler/app/Test.hs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ main = do
4141
Right decks ->
4242
if decks == [WithId deckId newDeck] then pure () else (error $ "Expected updated decks, got: " <> show decks)
4343

44+
runClientM (decksGetDeckId' deckId) clientEnv >>= \case
45+
Left err -> error $ "Expected decks, got error: " <> show err
46+
Right deck ->
47+
if deck == (WithId deckId newDeck) then pure () else (error $ "Expected get deck, got: " <> show deck)
48+
4449
runClientM slidesGet' clientEnv >>= \case
4550
Left err -> error $ "Expected slides, got error: " <> show err
4651
Right slides ->
@@ -57,6 +62,11 @@ main = do
5762
Right slides ->
5863
if slides == [WithId slideId updatedSlide] then pure () else (error $ "Expected updated slides, got: " <> show slides)
5964

65+
runClientM (slidesGetSlideId' slideId) clientEnv >>= \case
66+
Left err -> error $ "Expected updated slide, got error: " <> show err
67+
Right slide ->
68+
if slide == (WithId slideId updatedSlide) then pure () else (error $ "Expected updated slide, got: " <> show slide)
69+
6070
runClientM (slidesDelete' slideId) clientEnv >>= \case
6171
Left err -> error $ "Expected slide delete, got error: " <> show err
6272
Right {} -> pure ()
@@ -77,13 +87,27 @@ main = do
7787

7888
-- 'client' allows you to produce operations to query an API from a client.
7989
decksGet' :: ClientM [WithId DeckId Deck]
90+
decksGetDeckId' :: DeckId -> ClientM (WithId DeckId Deck)
8091
decksPost' :: Deck -> ClientM (WithId DeckId Deck)
8192
decksPut' :: DeckId -> Deck -> ClientM (WithId DeckId Deck)
8293
decksDelete' :: DeckId -> ClientM ()
8394
slidesGet' :: ClientM [WithId SlideId Slide]
95+
slidesGetSlideId' :: SlideId -> ClientM (WithId SlideId Slide)
8496
slidesPost' :: Slide -> ClientM (WithId SlideId Slide)
8597
slidesPut' :: SlideId -> Slide -> ClientM (WithId SlideId Slide)
8698
slidesDelete' :: SlideId -> ClientM ()
87-
((decksGet' :<|> decksPost' :<|> decksPut' :<|> decksDelete') :<|>
88-
(slidesGet' :<|> slidesPost' :<|> slidesPut' :<|> slidesDelete')
99+
((
100+
decksGet' :<|>
101+
decksGetDeckId' :<|>
102+
decksPost' :<|>
103+
decksPut' :<|>
104+
decksDelete'
105+
) :<|>
106+
(
107+
slidesGet' :<|>
108+
slidesGetSlideId' :<|>
109+
slidesPost' :<|>
110+
slidesPut' :<|>
111+
slidesDelete'
112+
)
89113
) = client api

infra/handler/src/DeckGo/Handler.hs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,12 +108,14 @@ type API =
108108

109109
type DecksAPI =
110110
Get '[JSON] [WithId DeckId Deck] :<|>
111+
Capture "deck_id" DeckId :> Get '[JSON] (WithId DeckId Deck) :<|>
111112
ReqBody '[JSON] Deck :> Post '[JSON] (WithId DeckId Deck) :<|>
112113
Capture "deck_id" DeckId :> ReqBody '[JSON] Deck :> Put '[JSON] (WithId DeckId Deck) :<|>
113114
Capture "deck_id" DeckId :> Delete '[JSON] ()
114115

115116
type SlidesAPI =
116117
Get '[JSON] [WithId SlideId Slide] :<|>
118+
Capture "slide_id" SlideId :> Get '[JSON] (WithId SlideId Slide) :<|>
117119
ReqBody '[JSON] Slide :> Post '[JSON] (WithId SlideId Slide) :<|>
118120
Capture "slide_id" SlideId :> ReqBody '[JSON] Slide :> Put '[JSON] (WithId SlideId Slide) :<|>
119121
Capture "slide_id" SlideId :> Delete '[JSON] ()
@@ -133,11 +135,13 @@ server env = serveDecks :<|> serveSlides
133135
where
134136
serveDecks =
135137
decksGet env :<|>
138+
decksGetDeckId env :<|>
136139
decksPost env :<|>
137140
decksPut env :<|>
138141
decksDelete env
139142
serveSlides =
140143
slidesGet env :<|>
144+
slidesGetSlideId env :<|>
141145
slidesPost env :<|>
142146
slidesPut env :<|>
143147
slidesDelete env
@@ -156,6 +160,32 @@ decksGet env = do
156160
liftIO $ print e
157161
Servant.throwError Servant.err500
158162

163+
decksGetDeckId :: Aws.Env -> DeckId -> Servant.Handler (WithId DeckId Deck)
164+
decksGetDeckId env deckId = do
165+
res <- runAWS env $ Aws.send $ DynamoDB.getItem "Decks" &
166+
DynamoDB.giKey .~ HMS.singleton "DeckId" (deckIdToAttributeValue deckId)
167+
case res of
168+
Right getItemResponse -> do
169+
case getItemResponse ^. DynamoDB.girsResponseStatus of
170+
200 -> pure ()
171+
404 -> do
172+
liftIO $ putStrLn $ "Item not found: " <> show getItemResponse
173+
Servant.throwError Servant.err404
174+
s -> do
175+
liftIO $
176+
putStrLn $ "Unkown response status: " <> show s <>
177+
" in response " <> show getItemResponse
178+
Servant.throwError Servant.err500
179+
180+
case itemToDeck (getItemResponse ^. DynamoDB.girsItem) of
181+
Nothing -> do
182+
liftIO $ putStrLn $ "Could not parse response: " <> show getItemResponse
183+
Servant.throwError Servant.err500
184+
Just deck -> pure deck
185+
Left e -> do
186+
liftIO $ print e
187+
Servant.throwError Servant.err500
188+
159189
decksPost :: Aws.Env -> Deck -> Servant.Handler (WithId DeckId Deck)
160190
decksPost env deck = do
161191

@@ -226,6 +256,32 @@ slidesGet env = do
226256
liftIO $ print e
227257
Servant.throwError Servant.err500
228258

259+
slidesGetSlideId :: Aws.Env -> SlideId -> Servant.Handler (WithId SlideId Slide)
260+
slidesGetSlideId env slideId = do
261+
res <- runAWS env $ Aws.send $ DynamoDB.getItem "Slides" &
262+
DynamoDB.giKey .~ HMS.singleton "SlideId" (slideIdToAttributeValue slideId)
263+
case res of
264+
Right getItemResponse -> do
265+
case getItemResponse ^. DynamoDB.girsResponseStatus of
266+
200 -> pure ()
267+
404 -> do
268+
liftIO $ putStrLn $ "Item not found: " <> show getItemResponse
269+
Servant.throwError Servant.err404
270+
s -> do
271+
liftIO $
272+
putStrLn $ "Unkown response status: " <> show s <>
273+
" in response " <> show getItemResponse
274+
Servant.throwError Servant.err500
275+
276+
case itemToSlide (getItemResponse ^. DynamoDB.girsItem) of
277+
Nothing -> do
278+
liftIO $ putStrLn $ "Could not parse response: " <> show getItemResponse
279+
Servant.throwError Servant.err500
280+
Just slide -> pure slide
281+
Left e -> do
282+
liftIO $ print e
283+
Servant.throwError Servant.err500
284+
229285
slidesPost :: Aws.Env -> Slide -> Servant.Handler (WithId SlideId Slide)
230286
slidesPost env slide = do
231287
slideId <- liftIO $ SlideId <$> newId

0 commit comments

Comments
 (0)