|
@@ -20,6 +20,7 @@ import Data.DateTime
|
|
|
import qualified Data.HashMap.Strict as HM
|
|
|
import Data.Maybe (catMaybes)
|
|
|
import Data.Text (Text)
|
|
|
+import Network.URI
|
|
|
|
|
|
import Codec.ActivityStream.Internal
|
|
|
|
|
@@ -47,19 +48,19 @@ makeLenses ''MediaLink
|
|
|
deriveJSON (commonOpts "_ml") ''MediaLink
|
|
|
|
|
|
data Object objType = Object
|
|
|
- { _oAttachments :: Maybe [Object objType]
|
|
|
+ { _oAttachments :: [Object objType]
|
|
|
, _oAuthor :: Maybe (Object objType)
|
|
|
, _oContent :: Maybe Text
|
|
|
, _oDisplayName :: Maybe Text
|
|
|
- , _oDownstreamDuplicates :: Maybe [Text]
|
|
|
- , _oId :: Maybe Text
|
|
|
+ , _oDownstreamDuplicates :: [URI]
|
|
|
+ , _oId :: Maybe URI
|
|
|
, _oImage :: Maybe MediaLink
|
|
|
, _oObjectType :: Maybe objType
|
|
|
, _oPublished :: Maybe DateTime
|
|
|
, _oSummary :: Maybe Text
|
|
|
, _oUpdated :: Maybe DateTime
|
|
|
- , _oUpstreamDuplicates :: Maybe [Text]
|
|
|
- , _oURL :: Maybe Text
|
|
|
+ , _oUpstreamDuplicates :: [URI]
|
|
|
+ , _oURL :: Maybe URI
|
|
|
, _oRest :: [(Text, Value)]
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
@@ -84,58 +85,65 @@ objectFields =
|
|
|
|
|
|
instance FromJSON objType => FromJSON (Object objType) where
|
|
|
parseJSON (Ae.Object o) =
|
|
|
- Object <$> o .:? "attachments"
|
|
|
+ Object <$> fmap go (o .:? "attachments")
|
|
|
<*> o .:? "author"
|
|
|
<*> o .:? "content"
|
|
|
<*> o .:? "displayName"
|
|
|
- <*> o .:? "downstreamDuplicates"
|
|
|
+ <*> fmap go (o .:? "downstreamDuplicates")
|
|
|
<*> o .:? "id"
|
|
|
<*> o .:? "image"
|
|
|
<*> o .:? "objectType"
|
|
|
<*> o .:? "published"
|
|
|
<*> o .:? "summary"
|
|
|
<*> o .:? "updated"
|
|
|
- <*> o .:? "upstreamDuplicates"
|
|
|
+ <*> fmap go (o .:? "upstreamDuplicates")
|
|
|
<*> o .:? "url"
|
|
|
<*> pure rest
|
|
|
where rest = HM.toList (foldr HM.delete o objectFields)
|
|
|
+ go :: Maybe [a] -> [a]
|
|
|
+ go Nothing = []
|
|
|
+ go (Just xs) = xs
|
|
|
|
|
|
instance ToJSON objType => ToJSON (Object objType) where
|
|
|
toJSON obj = object (attrs ++ _oRest obj)
|
|
|
where attrs = catMaybes
|
|
|
- [ "attachments" .=? _oAttachments obj
|
|
|
+ [ "attachments" .=! _oAttachments obj
|
|
|
, "author" .=? _oAuthor obj
|
|
|
, "content" .=? _oContent obj
|
|
|
, "displayName" .=? _oDisplayName obj
|
|
|
- , "downstreamDuplicates" .=? _oDownstreamDuplicates obj
|
|
|
+ , "downstreamDuplicates" .=! _oDownstreamDuplicates obj
|
|
|
, "id" .=? _oId obj
|
|
|
, "image" .=? _oImage obj
|
|
|
, "objectType" .=? _oObjectType obj
|
|
|
, "published" .=? _oPublished obj
|
|
|
, "summary" .=? _oSummary obj
|
|
|
, "updated" .=? _oUpdated obj
|
|
|
- , "upstreamDuplicates" .=? _oUpstreamDuplicates obj
|
|
|
+ , "upstreamDuplicates" .=! _oUpstreamDuplicates obj
|
|
|
, "url" .=? _oURL obj
|
|
|
]
|
|
|
(.=?) :: ToJSON a => Text -> Maybe a -> Maybe (Text, Value)
|
|
|
x .=? Just y = Just (x, toJSON y)
|
|
|
_ .=? Nothing = Nothing
|
|
|
infix 1 .=?
|
|
|
+ (.=!) :: ToJSON a => Text -> [a] -> Maybe (Text, Value)
|
|
|
+ _ .=! [] = Nothing
|
|
|
+ x .=! ys = Just (x, toJSON ys)
|
|
|
+ infix 1 .=!
|
|
|
|
|
|
emptyObject :: Object objType
|
|
|
emptyObject = Object
|
|
|
- { _oAttachments = Nothing
|
|
|
+ { _oAttachments = []
|
|
|
, _oAuthor = Nothing
|
|
|
, _oContent = Nothing
|
|
|
, _oDisplayName = Nothing
|
|
|
- , _oDownstreamDuplicates = Nothing
|
|
|
+ , _oDownstreamDuplicates = []
|
|
|
, _oId = Nothing
|
|
|
, _oImage = Nothing
|
|
|
, _oObjectType = Nothing
|
|
|
, _oPublished = Nothing
|
|
|
, _oSummary = Nothing
|
|
|
, _oUpdated = Nothing
|
|
|
- , _oUpstreamDuplicates = Nothing
|
|
|
+ , _oUpstreamDuplicates = []
|
|
|
, _oURL = Nothing
|
|
|
, _oRest = []
|
|
|
}
|
|
@@ -145,13 +153,13 @@ data Activity verb objType = Activity
|
|
|
, _acContent :: Maybe Text
|
|
|
, _acGenerator :: Maybe (Object objType)
|
|
|
, _acIcon :: Maybe MediaLink
|
|
|
- , _acId :: Maybe Text
|
|
|
+ , _acId :: Maybe URI
|
|
|
, _acPublished :: DateTime
|
|
|
, _acProvider :: Object objType
|
|
|
, _acTarget :: Maybe (Object objType)
|
|
|
, _acTitle :: Maybe Text
|
|
|
, _acUpdated :: Maybe DateTime
|
|
|
- , _acURL :: Maybe Text
|
|
|
+ , _acURL :: Maybe URI
|
|
|
, _acVerb :: Maybe verb
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
@@ -177,16 +185,16 @@ makeMinimalActivity actor published provider = Activity
|
|
|
|
|
|
data Collection objType = Collection
|
|
|
{ _cTotalItems :: Maybe Int
|
|
|
- , _cItems :: Maybe [Object objType]
|
|
|
- , _cURL :: Maybe Text
|
|
|
+ , _cItems :: [Object objType]
|
|
|
+ , _cURL :: Maybe URI
|
|
|
} deriving (Eq, Show)
|
|
|
|
|
|
makeLenses ''Collection
|
|
|
deriveJSON (commonOpts "_c") ''Collection
|
|
|
|
|
|
-makeCollection :: Maybe [Object objType] -> Maybe Text -> Collection objType
|
|
|
+makeCollection :: [Object objType] -> Maybe URI -> Collection objType
|
|
|
makeCollection objs url = Collection
|
|
|
- { _cTotalItems = fmap length objs
|
|
|
+ { _cTotalItems = Just (length objs)
|
|
|
, _cItems = objs
|
|
|
, _cURL = url
|
|
|
}
|