@@ -32,14 +32,14 @@ import qualified System.Random as Random
3232data WithId id a = WithId id a
3333
3434newtype DeckId = DeckId { unDeckId :: T. Text }
35- deriving newtype (Aeson.FromJSON , Aeson.ToJSON )
35+ deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData )
3636
3737data Deck = Deck
3838 { deckSlides :: [SlideId ]
3939 }
4040
4141newtype SlideId = SlideId { unSlideId :: T. Text }
42- deriving newtype (Aeson.FromJSON , Aeson.ToJSON )
42+ deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData )
4343
4444data Slide = Slide
4545 { slideContent :: T. Text
@@ -78,11 +78,13 @@ type API =
7878
7979type 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
8384type 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
8789api :: Proxy API
8890api = Proxy
@@ -105,8 +107,8 @@ main = do
105107server :: Aws. Env -> Servant. Server API
106108server 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
111113decksGet :: Aws. Env -> Servant. Handler [WithId DeckId Deck ]
112114decksGet 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+
135151runAWS :: MonadIO m => Aws. Env -> Aws. AWS a -> m (Either SomeException a )
136152runAWS 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+
167198randomString :: Int -> [Char ] -> IO String
168199randomString len allowedChars =
169200 replicateM len $ do
0 commit comments