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

Commit 2c70352

Browse files
committed
handler: handle PUT
1 parent dd79306 commit 2c70352

File tree

1 file changed

+37
-6
lines changed

1 file changed

+37
-6
lines changed

infra/handler/Main.hs

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ import qualified System.Random as Random
3232
data WithId id a = WithId id a
3333

3434
newtype DeckId = DeckId { unDeckId :: T.Text }
35-
deriving newtype (Aeson.FromJSON, Aeson.ToJSON)
35+
deriving newtype (Aeson.FromJSON, Aeson.ToJSON, FromHttpApiData)
3636

3737
data Deck = Deck
3838
{ deckSlides :: [SlideId]
3939
}
4040

4141
newtype SlideId = SlideId { unSlideId :: T.Text }
42-
deriving newtype (Aeson.FromJSON, Aeson.ToJSON)
42+
deriving newtype (Aeson.FromJSON, Aeson.ToJSON, FromHttpApiData)
4343

4444
data Slide = Slide
4545
{ slideContent :: T.Text
@@ -78,11 +78,13 @@ type API =
7878

7979
type DecksAPI =
8080
Get '[JSON] [WithId DeckId Deck] :<|>
81-
ReqBody '[JSON] Deck :> Post '[JSON] (WithId DeckId Deck)
81+
ReqBody '[JSON] Deck :> Post '[JSON] (WithId DeckId Deck) :<|>
82+
Capture "deck_id" DeckId :> ReqBody '[JSON] Deck :> Put '[JSON] (WithId DeckId Deck)
8283

8384
type SlidesAPI =
8485
Get '[JSON] [WithId SlideId Slide] :<|>
85-
ReqBody '[JSON] Slide :> Post '[JSON] (WithId SlideId Slide)
86+
ReqBody '[JSON] Slide :> Post '[JSON] (WithId SlideId Slide) :<|>
87+
Capture "slide_id" SlideId :> ReqBody '[JSON] Slide :> Put '[JSON] (WithId SlideId Slide)
8688

8789
api :: Proxy API
8890
api = Proxy
@@ -105,8 +107,8 @@ main = do
105107
server :: Aws.Env -> Servant.Server API
106108
server env = serveDecks :<|> serveSlides
107109
where
108-
serveDecks = decksGet env :<|> decksPost env
109-
serveSlides = slidesGet env :<|> slidesPost env
110+
serveDecks = decksGet env :<|> decksPost env :<|> decksPut env
111+
serveSlides = slidesGet env :<|> slidesPost env :<|> slidesPut env
110112

111113
decksGet :: Aws.Env -> Servant.Handler [WithId DeckId Deck]
112114
decksGet env = do
@@ -132,6 +134,20 @@ decksPost env deck = do
132134

133135
pure $ WithId deckId deck
134136

137+
decksPut :: Aws.Env -> DeckId -> Deck -> Servant.Handler (WithId DeckId Deck)
138+
decksPut env deckId deck = do
139+
140+
res <- runAWS env $ Aws.send $ DynamoDB.updateItem "Decks" &
141+
DynamoDB.uiUpdateExpression .~ Just "DeckSlides = :DeckSlides" &
142+
DynamoDB.uiExpressionAttributeValues .~ deckToItem deckId deck &
143+
DynamoDB.uiReturnValues .~ Just DynamoDB.UpdatedNew
144+
145+
case res of
146+
Right x -> liftIO $ print x
147+
Left e -> liftIO $ print e
148+
149+
pure $ WithId deckId deck
150+
135151
runAWS :: MonadIO m => Aws.Env -> Aws.AWS a -> m (Either SomeException a)
136152
runAWS env =
137153
liftIO .
@@ -164,6 +180,21 @@ slidesPost env slide = do
164180

165181
pure $ WithId slideId slide
166182

183+
slidesPut :: Aws.Env -> SlideId -> Slide -> Servant.Handler (WithId SlideId Slide)
184+
slidesPut env slideId slide = do
185+
186+
res <- runAWS env $ Aws.send $ DynamoDB.updateItem "Slides" &
187+
DynamoDB.uiUpdateExpression .~ Just
188+
"SlideContent = :SlideContent, SlideTemplate = :SlideTemplate, SlideAttributes = :SlideAttributes" &
189+
DynamoDB.uiExpressionAttributeValues .~ slideToItem slideId slide &
190+
DynamoDB.uiReturnValues .~ Just DynamoDB.UpdatedNew
191+
192+
case res of
193+
Right x -> liftIO $ print x
194+
Left e -> liftIO $ print e
195+
196+
pure $ WithId slideId slide
197+
167198
randomString :: Int -> [Char] -> IO String
168199
randomString len allowedChars =
169200
replicateM len $ do

0 commit comments

Comments
 (0)