mix format

This commit is contained in:
Mirai Kumiko 2025-06-08 10:58:48 +02:00
parent 7d8cb33405
commit 4fb1e200f1
Signed by: miraikumiko
GPG key ID: 3F178B1B5E0CB278
12 changed files with 221 additions and 69 deletions

View file

@ -25,9 +25,9 @@ defmodule Nulla.ActivityPub do
]
end
@spec ap_user(String.t(), Nulla.Models.User.t()) :: Jason.OrderedObject.t()
def ap_user(domain, user) do
Jason.OrderedObject.new([
@spec user(String.t(), Nulla.Models.User.t()) :: Jason.OrderedObject.t()
def user(domain, user) do
Jason.OrderedObject.new(
"@context": context(),
id: "https://#{domain}/@#{user.username}",
type: "Person",
@ -45,51 +45,52 @@ defmodule Nulla.ActivityPub do
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 ->
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} ->
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}"
),
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
@spec note(String.t(), Nulla.Models.User.t(), Nulla.Models.Note.t()) :: Jason.OrderedObject.t()
def note(domain, user, note) do
Jason.OrderedObject.new([
Jason.OrderedObject.new(
"@context": [
"https://www.w3.org/ns/activitystreams",
Jason.OrderedObject.new(
sensitive: "as:sensitive"
)
Jason.OrderedObject.new(sensitive: "as:sensitive")
],
id: "https://#{domain}/@#{user.username}/#{note.id}",
type: "Note",
@ -106,16 +107,25 @@ defmodule Nulla.ActivityPub do
],
sensetive: false,
content: note.content,
contentMap: Jason.OrderedObject.new(
"#{note.language}": "<p>@rf@mastodonsocial.ru Вниманию новичкам!</p><p>Вам небольшое руководство о том, как импротировать пост, которого нет в вашей ленте.</p>"
),
contentMap: Jason.OrderedObject.new("#{note.language}": note.content),
attachment: [
Jason.OrderedObject.new(
type: "Document",
mediaType: "video/mp4",
url: "https://mastodon.ml/system/media_attachments/files/000/040/494/original/8c06de179c11daea.mp4"
mediaType: "#{note.media_attachment.mime_type}",
url: "https://#{domain}/files/#{note.media_attachment.file}"
)
]
])
)
end
def activity(domain, action) do
Jason.OrderedObject.new(
"@context": "https://www.w3.org/ns/activitystreams",
id: "https://#{domain}/activities/#{action.id}",
type: action.type,
actor: action.actor,
object: action.object,
to: action.to
)
end
end

View file

@ -0,0 +1,21 @@
defmodule Nulla.Models.Activity do
use Ecto.Schema
import Ecto.Changeset
schema "activities" do
field :type, :string
field :actor, :string
field :object, :map
field :cc, {:array, :string}, default: []
timestamps()
end
@doc false
def changeset(activity, attrs) do
activity
|> cast(attrs, [:type, :actor, :object, :to])
|> validate_required([:type, :actor, :object])
|> validate_inclusion(:type, ~w(Create Update Delete Undo Like Announce Follow Accept Reject))
end
end

View file

@ -18,8 +18,26 @@ defmodule Nulla.Models.InstanceSettings do
@doc false
def changeset(instance_settings, attrs) do
instance_settings
|> cast(attrs, [:name, :description, :domain, :registration, :max_characters, :max_upload_size, :public_key, :private_key])
|> validate_required([:name, :description, :domain, :registration, :max_characters, :max_upload_size, :public_key, :private_key])
|> cast(attrs, [
:name,
:description,
:domain,
:registration,
:max_characters,
:max_upload_size,
:public_key,
:private_key
])
|> validate_required([
:name,
:description,
:domain,
:registration,
:max_characters,
:max_upload_size,
:public_key,
:private_key
])
end
def get_instance_settings!, do: Repo.one!(InstanceSettings)

View file

@ -7,7 +7,11 @@ defmodule Nulla.Models.Note do
schema "notes" do
field :content, :string
field :visibility, Ecto.Enum, values: [:public, :unlisted, :followers, :private], default: :public
field :visibility, Ecto.Enum,
values: [:public, :unlisted, :followers, :private],
default: :public
field :sensitive, :boolean, default: false
field :language, :string
field :in_reply_to, :string

View file

@ -35,8 +35,46 @@ defmodule Nulla.Models.User do
@doc false
def changeset(user, attrs) do
user
|> cast(attrs, [:username, :email, :password, :is_moderator, :realname, :bio, :location, :birthday, :fields, :follow_approval, :is_bot, :is_discoverable, :is_indexable, :is_memorial, :private_key, :public_key, :avatar, :banner])
|> validate_required([:username, :email, :password, :is_moderator, :realname, :bio, :location, :birthday, :fields, :follow_approval, :is_bot, :is_discoverable, :is_indexable, :is_memorial, :private_key, :public_key, :avatar, :banner])
|> cast(attrs, [
:username,
:email,
:password,
:is_moderator,
:realname,
:bio,
:location,
:birthday,
:fields,
:follow_approval,
:is_bot,
:is_discoverable,
:is_indexable,
:is_memorial,
:private_key,
:public_key,
:avatar,
:banner
])
|> validate_required([
:username,
:email,
:password,
:is_moderator,
:realname,
:bio,
:location,
:birthday,
:fields,
:follow_approval,
:is_bot,
:is_discoverable,
:is_indexable,
:is_memorial,
:private_key,
:public_key,
:avatar,
:banner
])
end
def get_user_by_username!(username), do: Repo.get_by!(User, username: username)

View file

@ -11,7 +11,7 @@ defmodule Nulla.Uploader do
|> Enum.chunk_every(3)
|> Enum.map(&Enum.join/1)
filename = String.slice(hash, 15..-1) <> file_type
filename = String.slice(hash, 15..-1//1) <> file_type
relative_path = Path.join(segments) <> "/" <> filename
dest_path = Path.join(["priv/static/files", relative_path])