72 lines
1.3 KiB
Haskell
72 lines
1.3 KiB
Haskell
module Fedi.Webfinger where
|
|
|
|
import Data.String (fromString)
|
|
import Data.Aeson qualified as A
|
|
import Fedi.Types
|
|
|
|
data Webfinger
|
|
= Webfinger
|
|
{ subject :: Subject
|
|
, links :: [Link]
|
|
}
|
|
deriving Show
|
|
|
|
data Subject
|
|
= Subject
|
|
{ username :: Username
|
|
, domain :: Domain
|
|
}
|
|
deriving Show
|
|
|
|
ppSubject :: Subject -> String
|
|
ppSubject subject =
|
|
"acct:" <> subject.username <> "@" <> subject.domain
|
|
|
|
data Link
|
|
= Link
|
|
{ rel :: Rel
|
|
, type_ :: LinkType
|
|
, href :: Url
|
|
}
|
|
deriving Show
|
|
|
|
makeWebfinger :: UserDetails -> Webfinger
|
|
makeWebfinger details =
|
|
let
|
|
url = "https://" <> details.domain
|
|
in
|
|
Webfinger
|
|
{ subject = Subject
|
|
{ username = details.username
|
|
, domain = details.domain
|
|
}
|
|
, links =
|
|
[ Link
|
|
{ rel = Self
|
|
, type_ = ActivityJson
|
|
, href = url <> "/" <> details.username
|
|
}
|
|
]
|
|
}
|
|
|
|
-- * -------------------------
|
|
---
|
|
|
|
instance A.ToJSON Webfinger where
|
|
toJSON webfinger =
|
|
A.object
|
|
[ "subject" A..= webfinger.subject
|
|
, "links" A..= webfinger.links
|
|
]
|
|
|
|
instance A.ToJSON Subject where
|
|
toJSON subject =
|
|
fromString $ ppSubject subject
|
|
|
|
instance A.ToJSON Link where
|
|
toJSON link =
|
|
A.object
|
|
[ "rel" A..= link.rel
|
|
, "type" A..= link.type_
|
|
, "href" A..= link.href
|
|
]
|