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

Commit 50bbb01

Browse files
authored
Merge pull request #93 from deckgo/nm-deck-attributes
Add attributes to decks
2 parents 5dab851 + d2761a6 commit 50bbb01

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

infra/handler/app/Test.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ main = do
3434
let someFirebaseId = FirebaseId "the-uid" -- from ./token
3535
let someUserId = UserId someFirebaseId
3636

37-
let someDeck = Deck { deckSlides = [] , deckDeckname = Deckname "foo", deckOwnerId = someUserId }
37+
let someDeck = Deck { deckSlides = [] , deckDeckname = Deckname "foo", deckOwnerId = someUserId, deckAttributes = HMS.empty }
3838

3939
deckId <- runClientM (decksPost' b someDeck) clientEnv >>= \case
4040
Left err -> error $ "Expected new deck, got error: " <> show err
@@ -46,7 +46,7 @@ main = do
4646
Left err -> error $ "Expected new slide, got error: " <> show err
4747
Right (Item slideId _) -> pure slideId
4848

49-
let newDeck = Deck { deckSlides = [ slideId ], deckDeckname = Deckname "bar", deckOwnerId = someUserId }
49+
let newDeck = Deck { deckSlides = [ slideId ], deckDeckname = Deckname "bar", deckOwnerId = someUserId, deckAttributes = HMS.singleton "foo" "bar" }
5050

5151
runClientM (decksPut' b deckId newDeck) clientEnv >>= \case
5252
Left err -> error $ "Expected updated deck, got error: " <> show err

infra/handler/src/DeckGo/Handler.hs

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616

1717
module 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

2628
import Control.Lens hiding ((.=))
2729
import 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

179182
instance 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

186190
instance 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

193198
instance Aeson.FromJSON Deck where
@@ -472,7 +477,7 @@ decksPut :: Aws.Env -> Firebase.UserId -> DeckId -> Deck -> Servant.Handler (Ite
472477
decksPut 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

656661
deckToItem :: 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

663669
deckToItem' :: 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

669676
itemToDeck :: HMS.HashMap T.Text DynamoDB.AttributeValue -> Maybe (Item DeckId Deck)
670677
itemToDeck 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)) =
706714
deckOwnerIdFromAttributeValue :: DynamoDB.AttributeValue -> Maybe UserId
707715
deckOwnerIdFromAttributeValue 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

711736
slideToItem :: SlideId -> Slide -> HMS.HashMap T.Text DynamoDB.AttributeValue

0 commit comments

Comments
 (0)