@@ -136,10 +136,10 @@ instance ToJSONObject User where
136136
137137instance Aeson. FromJSON User where
138138 parseJSON = Aeson. withObject " User" parseJSONObject
139+
139140instance Aeson. ToJSON User where
140141 toJSON = Aeson. Object . toJSONObject
141142
142-
143143instance ToSchema (Item UserId User ) where
144144 declareNamedSchema _ = pure $ NamedSchema (Just " UserWithId" ) mempty
145145
@@ -164,6 +164,7 @@ type DecksAPI =
164164 Capture " deck_id" DeckId :>
165165 ReqBody '[JSON ] Deck :> Put '[JSON ] (Item DeckId Deck ) :<|>
166166 Protected :> Capture " deck_id" DeckId :> Delete '[JSON ] ()
167+ -- Capture "deck_id" DeckId :> "slides" :> SlidesAPI
167168
168169newtype DeckId = DeckId { unDeckId :: T. Text }
169170 deriving newtype (Aeson.FromJSON , Aeson.ToJSON , FromHttpApiData , ToHttpApiData , Show , Eq )
@@ -179,6 +180,24 @@ data Deck = Deck
179180 , deckAttributes :: HMS. HashMap T. Text T. Text
180181 } deriving (Show , Eq )
181182
183+
184+ {-
185+ data Deck = Deck
186+ { deckSlides :: [SlideId]
187+ , deckOwnerId :: UserId
188+ , deckAttributes :: HMS.HashMap T.Text T.Text
189+ , deckTitle :: T.Text
190+ , deckDescription :: Maybe T.Text
191+ , deckAuthor :: Maybe T.Text
192+ , deckHashTags :: [CI T.Text]
193+ , deckPublicationDate :: Maybe UTCTime
194+ } deriving (Show, Eq)
195+ -}
196+
197+
198+
199+ -- /decks/<deck-id>/publish
200+
182201instance FromJSONObject Deck where
183202 parseJSONObject = \ obj ->
184203 Deck
@@ -215,16 +234,19 @@ instance ToParamSchema DeckId where
215234-- SLIDES
216235
217236type SlidesAPI =
218- Protected :> Get '[JSON ] [Item SlideId Slide ] :<|>
219- Protected :>
237+
238+ -- Protected :> Capture "deck_id" DeckId :> Delete '[JSON] ()
239+ Protected :> Capture " deck_id" DeckId :> " slides" :> Get '[JSON ] [Item SlideId Slide ] :<|>
240+ Protected :> Capture " deck_id" DeckId :> " slides" :>
220241 Capture " slide_id" SlideId :> Get '[JSON ] (Item SlideId Slide ) :<|>
221- Protected :>
242+ Protected :> Capture " deck_id " DeckId :> " slides " :>
222243 ReqBody '[JSON ] Slide :> Post '[JSON ] (Item SlideId Slide ) :<|>
223- Protected :>
244+ Protected :> Capture " deck_id " DeckId :> " slides " :>
224245 Capture " slide_id" SlideId :>
225246 ReqBody '[JSON ] Slide :>
226247 Put '[JSON ] (Item SlideId Slide ) :<|>
227- Protected :> Capture " slide_id" SlideId :> Delete '[JSON ] ()
248+ Protected :> Capture " deck_id" DeckId :> " slides" :>
249+ Capture " slide_id" SlideId :> Delete '[JSON ] ()
228250
229251instance ToSchema (Item SlideId Slide ) where
230252 declareNamedSchema _ = pure $ NamedSchema (Just " SlideWithId" ) mempty
@@ -548,7 +570,18 @@ decksPut env fuid deckId deck = do
548570 pure $ Item deckId deck
549571
550572decksDelete :: Aws. Env -> Firebase. UserId -> DeckId -> Servant. Handler ()
551- decksDelete env _ deckId = do
573+ decksDelete env fuid deckId = do
574+
575+ getDeck env deckId >>= \ case
576+ Nothing -> do
577+ liftIO $ putStrLn $ unwords
578+ [ " Trying to DELETE" , show deckId, " but deck doesn't exist." ]
579+ Servant. throwError Servant. err404
580+ Just Deck {deckOwnerId} -> do
581+ when (Firebase. unUserId fuid /= unFirebaseId (unUserId deckOwnerId)) $ do
582+ liftIO $ putStrLn $ unwords $
583+ [ " Deck was DELETEd" , show deckId, " but requester is not the owner" , show fuid ]
584+ Servant. throwError Servant. err404
552585
553586 res <- runAWS env $ Aws. send $ DynamoDB. deleteItem " Decks" &
554587 DynamoDB. diKey .~ HMS. singleton " DeckId"
@@ -600,8 +633,8 @@ getDeck env deckId = do
600633
601634-- SLIDES
602635
603- slidesGet :: Aws. Env -> Firebase. UserId -> Servant. Handler [Item SlideId Slide ]
604- slidesGet env _ = do
636+ slidesGet :: Aws. Env -> Firebase. UserId -> DeckId -> Servant. Handler [Item SlideId Slide ]
637+ slidesGet env _ _ = do
605638 res <- runAWS env $ Aws. send $ DynamoDB. scan " Slides"
606639 case res of
607640 Right scanResponse ->
@@ -615,8 +648,8 @@ slidesGet env _ = do
615648 liftIO $ print e
616649 Servant. throwError Servant. err500
617650
618- slidesGetSlideId :: Aws. Env -> Firebase. UserId -> SlideId -> Servant. Handler (Item SlideId Slide )
619- slidesGetSlideId env _ slideId = do
651+ slidesGetSlideId :: Aws. Env -> Firebase. UserId -> DeckId -> SlideId -> Servant. Handler (Item SlideId Slide )
652+ slidesGetSlideId env _ _ slideId = do
620653 res <- runAWS env $ Aws. send $ DynamoDB. getItem " Slides" &
621654 DynamoDB. giKey .~ HMS. singleton " SlideId" (slideIdToAttributeValue slideId)
622655 case res of
@@ -641,8 +674,8 @@ slidesGetSlideId env _ slideId = do
641674 liftIO $ print e
642675 Servant. throwError Servant. err500
643676
644- slidesPost :: Aws. Env -> Firebase. UserId -> Slide -> Servant. Handler (Item SlideId Slide )
645- slidesPost env _ slide = do
677+ slidesPost :: Aws. Env -> Firebase. UserId -> DeckId -> Slide -> Servant. Handler (Item SlideId Slide )
678+ slidesPost env _ _ slide = do
646679 slideId <- liftIO $ SlideId <$> newId
647680
648681 res <- runAWS env $
@@ -657,8 +690,8 @@ slidesPost env _ slide = do
657690
658691 pure $ Item slideId slide
659692
660- slidesPut :: Aws. Env -> Firebase. UserId -> SlideId -> Slide -> Servant. Handler (Item SlideId Slide )
661- slidesPut env _ slideId slide = do
693+ slidesPut :: Aws. Env -> Firebase. UserId -> DeckId -> SlideId -> Slide -> Servant. Handler (Item SlideId Slide )
694+ slidesPut env _ _ slideId slide = do
662695
663696 res <- runAWS env $ Aws. send $ DynamoDB. updateItem " Slides" &
664697 DynamoDB. uiUpdateExpression .~ Just
@@ -676,8 +709,8 @@ slidesPut env _ slideId slide = do
676709
677710 pure $ Item slideId slide
678711
679- slidesDelete :: Aws. Env -> Firebase. UserId -> SlideId -> Servant. Handler ()
680- slidesDelete env _ slideId = do
712+ slidesDelete :: Aws. Env -> Firebase. UserId -> DeckId -> SlideId -> Servant. Handler ()
713+ slidesDelete env _ _ slideId = do
681714
682715 res <- runAWS env $ Aws. send $ DynamoDB. deleteItem " Slides" &
683716 DynamoDB. diKey .~ HMS. singleton " SlideId"
0 commit comments