1616
1717module DeckGo.Handler where
1818
19+ -- TODO: created_at, updated_at
20+ -- TODO: improve swagger description
21+ -- TODO: feed API
22+
1923-- TODO: double check what is returned on 200 from DynamoDB
2024-- TODO: check permissions
21- -- TODO: created_at, updated_at
2225-- TODO: TTL on anonymous users
2326-- TODO: enforce uniqueness on deck_name (per user)
24- -- TODO: improve swagger description
2527
2628import Control.Lens hiding ((.=) )
2729import Control.Monad
@@ -174,6 +176,7 @@ data Deck = Deck
174176 { deckSlides :: [SlideId ]
175177 , deckDeckname :: Deckname
176178 , deckOwnerId :: UserId
179+ , deckAttributes :: HMS. HashMap T. Text T. Text
177180 } deriving (Show , Eq )
178181
179182instance FromJSONObject Deck where
@@ -182,12 +185,14 @@ instance FromJSONObject Deck where
182185 <$> obj .: " slides"
183186 <*> obj .: " name"
184187 <*> obj .: " owner_id"
188+ <*> obj .: " attributes"
185189
186190instance ToJSONObject Deck where
187191 toJSONObject deck = HMS. fromList
188192 [ " slides" .= deckSlides deck
189193 , " name" .= deckDeckname deck
190194 , " owner_id" .= deckOwnerId deck
195+ , " attributes" .= deckAttributes deck
191196 ]
192197
193198instance Aeson. FromJSON Deck where
@@ -472,7 +477,7 @@ decksPut :: Aws.Env -> Firebase.UserId -> DeckId -> Deck -> Servant.Handler (Ite
472477decksPut env _ deckId deck = do
473478
474479 res <- runAWS env $ Aws. send $ DynamoDB. updateItem " Decks" &
475- DynamoDB. uiUpdateExpression .~ Just " SET DeckSlides = :s, DeckName = :n, DeckOwnerId = :o" &
480+ DynamoDB. uiUpdateExpression .~ Just " SET DeckSlides = :s, DeckName = :n, DeckOwnerId = :o, DeckAttributes = :a " &
476481 DynamoDB. uiExpressionAttributeValues .~ deckToItem' deck &
477482 DynamoDB. uiReturnValues .~ Just DynamoDB. UpdatedNew &
478483 DynamoDB. uiKey .~ HMS. singleton " DeckId"
@@ -654,24 +659,27 @@ userDecksFromAttributeValue attr =
654659-- DECKS
655660
656661deckToItem :: DeckId -> Deck -> HMS. HashMap T. Text DynamoDB. AttributeValue
657- deckToItem deckId Deck {deckSlides, deckDeckname, deckOwnerId} =
662+ deckToItem deckId Deck {deckSlides, deckDeckname, deckOwnerId, deckAttributes } =
658663 HMS. singleton " DeckId" (deckIdToAttributeValue deckId) <>
659664 HMS. singleton " DeckSlides" (deckSlidesToAttributeValue deckSlides) <>
660665 HMS. singleton " DeckName" (deckNameToAttributeValue deckDeckname) <>
661- HMS. singleton " DeckOwnerId" (deckOwnerIdToAttributeValue deckOwnerId)
666+ HMS. singleton " DeckOwnerId" (deckOwnerIdToAttributeValue deckOwnerId) <>
667+ HMS. singleton " DeckAttributes" (deckAttributesToAttributeValue deckAttributes)
662668
663669deckToItem' :: Deck -> HMS. HashMap T. Text DynamoDB. AttributeValue
664- deckToItem' Deck {deckSlides, deckDeckname, deckOwnerId} =
670+ deckToItem' Deck {deckSlides, deckDeckname, deckOwnerId, deckAttributes } =
665671 HMS. singleton " :s" (deckSlidesToAttributeValue deckSlides) <>
666672 HMS. singleton " :n" (deckNameToAttributeValue deckDeckname) <>
667- HMS. singleton " :o" (deckOwnerIdToAttributeValue deckOwnerId)
673+ HMS. singleton " :o" (deckOwnerIdToAttributeValue deckOwnerId) <>
674+ HMS. singleton " :a" (deckAttributesToAttributeValue deckAttributes)
668675
669676itemToDeck :: HMS. HashMap T. Text DynamoDB. AttributeValue -> Maybe (Item DeckId Deck )
670677itemToDeck item = do
671678 deckId <- HMS. lookup " DeckId" item >>= deckIdFromAttributeValue
672679 deckSlides <- HMS. lookup " DeckSlides" item >>= deckSlidesFromAttributeValue
673680 deckDeckname <- HMS. lookup " DeckName" item >>= deckNameFromAttributeValue
674681 deckOwnerId <- HMS. lookup " DeckOwnerId" item >>= deckOwnerIdFromAttributeValue
682+ deckAttributes <- HMS. lookup " DeckAttributes" item >>= deckAttributesFromAttributeValue
675683 pure $ Item deckId Deck {.. }
676684
677685-- DECK ATTRIBUTES
@@ -706,6 +714,23 @@ deckOwnerIdToAttributeValue (UserId (FirebaseId deckOwnerId)) =
706714deckOwnerIdFromAttributeValue :: DynamoDB. AttributeValue -> Maybe UserId
707715deckOwnerIdFromAttributeValue attr = (UserId . FirebaseId ) <$> attr ^. DynamoDB. avS
708716
717+ deckAttributesToAttributeValue :: HMS. HashMap T. Text T. Text -> DynamoDB. AttributeValue
718+ deckAttributesToAttributeValue attributes =
719+ DynamoDB. attributeValue & DynamoDB. avM .~
720+ HMS. map attributeValueToAttributeValue attributes
721+ where
722+ attributeValueToAttributeValue :: T. Text -> DynamoDB. AttributeValue
723+ attributeValueToAttributeValue attrValue =
724+ DynamoDB. attributeValue & DynamoDB. avB .~ Just (T. encodeUtf8 attrValue)
725+
726+ deckAttributesFromAttributeValue :: DynamoDB. AttributeValue -> Maybe (HMS. HashMap T. Text T. Text )
727+ deckAttributesFromAttributeValue attr =
728+ traverse attributeValueFromAttributeValue (attr ^. DynamoDB. avM)
729+ where
730+ attributeValueFromAttributeValue :: DynamoDB. AttributeValue -> Maybe T. Text
731+ attributeValueFromAttributeValue attrValue =
732+ T. decodeUtf8 <$> attrValue ^. DynamoDB. avB
733+
709734-- SLIDES
710735
711736slideToItem :: SlideId -> Slide -> HMS. HashMap T. Text DynamoDB. AttributeValue
0 commit comments