Add activitypub.ex
This commit is contained in:
parent
40a9e0e961
commit
5b0427ad59
1 changed files with 84 additions and 0 deletions
84
lib/nulla/activitypub.ex
Normal file
84
lib/nulla/activitypub.ex
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
defmodule Nulla.ActivityPub do
|
||||||
|
@spec context() :: list()
|
||||||
|
defp context do
|
||||||
|
[
|
||||||
|
"https://www.w3.org/ns/activitystreams",
|
||||||
|
"https://w3id.org/security/v1",
|
||||||
|
Jason.OrderedObject.new(
|
||||||
|
manuallyApprovesFollowers: "as:manuallyApprovesFollowers",
|
||||||
|
toot: "http://joinmastodon.org/ns#",
|
||||||
|
featured: %{"@id" => "toot:featured", "@type" => "@id"},
|
||||||
|
featuredTags: %{"@id" => "toot:featuredTags", "@type" => "@id"},
|
||||||
|
alsoKnownAs: %{"@id" => "as:alsoKnownAs", "@type" => "@id"},
|
||||||
|
movedTo: %{"@id" => "as:movedTo", "@type" => "@id"},
|
||||||
|
schema: "http://schema.org#",
|
||||||
|
PropertyValue: "schema:PropertyValue",
|
||||||
|
value: "schema:value",
|
||||||
|
discoverable: "toot:discoverable",
|
||||||
|
suspended: "toot:suspended",
|
||||||
|
memorial: "toot:memorial",
|
||||||
|
indexable: "toot:indexable",
|
||||||
|
attributionDomains: %{"@id" => "toot:attributionDomains", "@type" => "@id"},
|
||||||
|
Hashtag: "as:Hashtag",
|
||||||
|
focalPoint: %{"@container" => "@list", "@id" => "toot:focalPoint"}
|
||||||
|
)
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
@spec ap_user(String.t(), Nulla.Users.User.t()) :: Jason.OrderedObject.t()
|
||||||
|
def ap_user(domain, user) do
|
||||||
|
Jason.OrderedObject.new([
|
||||||
|
"@context": context(),
|
||||||
|
id: "https://#{domain}/@#{user.username}",
|
||||||
|
type: "Person",
|
||||||
|
following: "https://#{domain}/@#{user.username}/following",
|
||||||
|
followers: "https://#{domain}/@#{user.username}/followers",
|
||||||
|
inbox: "https://#{domain}/@#{user.username}/inbox",
|
||||||
|
outbox: "https://#{domain}/@#{user.username}/outbox",
|
||||||
|
featured: "https://#{domain}/@#{user.username}/collections/featured",
|
||||||
|
preferredUsername: user.username,
|
||||||
|
name: user.realname,
|
||||||
|
summary: user.bio,
|
||||||
|
url: "https://#{domain}/@#{user.username}",
|
||||||
|
manuallyApprovesFollowers: user.follow_approval,
|
||||||
|
discoverable: user.is_discoverable,
|
||||||
|
indexable: user.is_indexable,
|
||||||
|
published: DateTime.to_iso8601(user.inserted_at),
|
||||||
|
memorial: user.is_memorial,
|
||||||
|
publicKey: Jason.OrderedObject.new(
|
||||||
|
id: "https://#{domain}/@#{user.username}#main-key",
|
||||||
|
owner: "https://#{domain}/@#{user.username}",
|
||||||
|
publicKeyPem: user.public_key
|
||||||
|
),
|
||||||
|
tag: Enum.map(user.tags, fn tag ->
|
||||||
|
Jason.OrderedObject.new(
|
||||||
|
type: "Hashtag",
|
||||||
|
href: "https://#{domain}/tags/#{tag}",
|
||||||
|
name: "##{tag}"
|
||||||
|
)
|
||||||
|
end),
|
||||||
|
attachment: Enum.map(user.fields, fn {name, value} ->
|
||||||
|
Jason.OrderedObject.new(
|
||||||
|
type: "PropertyValue",
|
||||||
|
name: name,
|
||||||
|
value: value
|
||||||
|
)
|
||||||
|
end),
|
||||||
|
endpoints: Jason.OrderedObject.new(
|
||||||
|
sharedInbox: "https://#{domain}/inbox"
|
||||||
|
),
|
||||||
|
icon: Jason.OrderedObject.new(
|
||||||
|
type: "Image",
|
||||||
|
mediaType: MIME.from_path(user.avatar),
|
||||||
|
url: "https://#{domain}#{user.avatar}"
|
||||||
|
),
|
||||||
|
image: Jason.OrderedObject.new(
|
||||||
|
type: "Image",
|
||||||
|
mediaType: MIME.from_path(user.banner),
|
||||||
|
url: "https://#{domain}#{user.banner}"
|
||||||
|
),
|
||||||
|
"vcard:bday": user.birthday,
|
||||||
|
"vcard:Address": user.location
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue