module Fedi.Activity where import Data.Aeson qualified as A import Data.Text qualified as T import Fedi.Types import Fedi.Actor import Data.Time (UTCTime) data Activity = Create { createId :: ActivityUrl , actor :: ActorId , object :: Object } type ActivityUrl = Url data Object = NoteObject Note data Note = Note { noteId :: NoteId , notePublished :: UTCTime , noteActor :: ActorId , noteContent :: T.Text , noteName :: Maybe String , noteUrl :: Maybe Url , noteReplies :: Collection Unordered Note } type NoteId = Url type Followers = [Actor] type Following = [Actor] type Inbox = Collection Ordered Activity type Outbox = Collection Unordered Activity data Ordered data Unordered data Collection order a = Collection { collectionSummary :: String , collectionItems :: [a] } instance A.ToJSON Note where toJSON note = A.object [ "type" A..= ("Note" :: String) , "id" A..= note.noteId , "published" A..= note.notePublished , "attributedTo" A..= note.noteActor , "content" A..= note.noteContent ] instance A.ToJSON Object where toJSON = \case NoteObject note -> A.toJSON note instance A.ToJSON Activity where toJSON = \case create@Create{} -> A.object [ "@context" A..= [ "https://www.w3.org/ns/activitystreams" :: String ] , "type" A..= ("Create" :: String) , "id" A..= create.createId , "actor" A..= create.actor , "object" A..= create.object ] instance A.ToJSON a => A.ToJSON (Collection Ordered a) where toJSON collection = A.object [ "@context" A..= [ "https://www.w3.org/ns/activitystreams" :: String ] , "type" A..= ("OrderedCollection" :: String) , "summary" A..= collection.collectionSummary , "totalItems" A..= length collection.collectionItems , "orderedItems" A..= collection.collectionItems ] instance A.ToJSON a => A.ToJSON (Collection Unordered a) where toJSON collection = A.object [ "@context" A..= [ "https://www.w3.org/ns/activitystreams" :: String ] , "type" A..= ("Collection" :: String) , "summary" A..= collection.collectionSummary , "totalItems" A..= length collection.collectionItems , "items" A..= collection.collectionItems ] {- "@context": "https://www.w3.org/ns/activitystreams", "summary": "Sally's notes", "type": "OrderedCollection", "totalItems": 2, "orderedItems": [ { "type": "Note", "name": "A Simple Note" }, { "type": "Note", "name": "Another Simple Note" } ] -}