88{-# LANGUAGE RecordWildCards #-}
99{-# LANGUAGE TypeOperators #-}
1010
11+ module DeckGo.Handler where
12+
1113import Control.Monad
1214import Control.Lens hiding ((.=) )
1315import Data.Proxy
@@ -20,8 +22,7 @@ import Data.Aeson ((.=), (.:), (.!=), (.:?))
2022import qualified Data.Aeson as Aeson
2123import qualified Network.AWS as Aws
2224import qualified Network.AWS.DynamoDB as DynamoDB
23- import qualified Network.Wai.Handler.Lambda as Lambda
24- import qualified Network.Wai.Middleware.Cors as Cors
25+ import qualified Network.Wai as Wai
2526import qualified Servant as Servant
2627import qualified System.Random as Random
2728
@@ -32,14 +33,14 @@ import qualified System.Random as Random
3233data WithId id a = WithId id a
3334
3435newtype DeckId = DeckId { unDeckId :: T. Text }
35- deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData )
36+ deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData , ToHttpApiData )
3637
3738data Deck = Deck
3839 { deckSlides :: [SlideId ]
3940 }
4041
4142newtype SlideId = SlideId { unSlideId :: T. Text }
42- deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData )
43+ deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData , ToHttpApiData )
4344
4445data Slide = Slide
4546 { slideContent :: T. Text
@@ -51,19 +52,47 @@ instance Aeson.FromJSON Deck where
5152 parseJSON = Aeson. withObject " decK" $ \ obj ->
5253 Deck <$> obj .: " deck_slides"
5354
55+ instance Aeson. ToJSON Deck where
56+ toJSON deck = Aeson. object
57+ [ " deck_slides" .= deckSlides deck
58+ ]
59+
5460instance Aeson. FromJSON Slide where
5561 parseJSON = Aeson. withObject " slide" $ \ obj ->
5662 Slide <$>
5763 obj .: " slide_content" <*>
5864 obj .: " slide_template" <*>
5965 obj .:? " slide_attributes" .!= HMS. empty
6066
67+ instance Aeson. ToJSON Slide where
68+ toJSON slide = Aeson. object
69+ [ " slide_template" .= slideTemplate slide
70+ , " slide_attributes" .= slideAttributes slide
71+ , " slide_content" .= slideContent slide
72+ ]
73+
74+ instance Aeson. FromJSON (WithId DeckId Deck ) where
75+ parseJSON = Aeson. withObject " WithId DeckId Deck" $ \ o ->
76+ WithId <$>
77+ (DeckId <$> o .: " deck_id" ) <*>
78+ (Deck <$> o .: " deck_slides" )
79+
6180instance Aeson. ToJSON (WithId DeckId Deck ) where
6281 toJSON (WithId deckId deck) = Aeson. object
6382 [ " deck_id" .= deckId
6483 , " deck_slides" .= deckSlides deck
6584 ]
6685
86+ instance Aeson. FromJSON (WithId SlideId Slide ) where
87+ parseJSON = Aeson. withObject " WithId SlideId Slide" $ \ o ->
88+ WithId <$>
89+ (SlideId <$> o .: " slide_id" ) <*>
90+ (Slide <$>
91+ o .: " slide_content" <*>
92+ o .: " slide_template" <*>
93+ o .: " slide_attributes"
94+ )
95+
6796instance Aeson. ToJSON (WithId SlideId Slide ) where
6897 toJSON (WithId slideId slide) = Aeson. object
6998 [ " slide_id" .= slideId
@@ -93,16 +122,8 @@ api = Proxy
93122-- SERVER
94123------------------------------------------------------------------------------
95124
96- main :: IO ()
97- main = do
98- hSetBuffering stdin LineBuffering
99- hSetBuffering stdout LineBuffering
100-
101- liftIO $ putStrLn " Booting..."
102- env <- Aws. newEnv Aws. Discover
103-
104- liftIO $ putStrLn " Booted!"
105- Lambda. run $ Cors. simpleCors $ Servant. serve api (server env)
125+ application :: Aws. Env -> Wai. Application
126+ application env = Servant. serve api (server env)
106127
107128server :: Aws. Env -> Servant. Server API
108129server env = serveDecks :<|> serveSlides
0 commit comments