|
|
|
@ -12,57 +12,72 @@ defmodule GcIndexRelay.Nostr.PubEvent do |
|
|
|
@derive Jason.Encoder |
|
|
|
@derive Jason.Encoder |
|
|
|
defstruct [:id, :pubkey, :created_at, :kind, :tags, :content, :sig] |
|
|
|
defstruct [:id, :pubkey, :created_at, :kind, :tags, :content, :sig] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@type t :: %__MODULE__{ |
|
|
|
|
|
|
|
id: binary(), |
|
|
|
|
|
|
|
pubkey: binary(), |
|
|
|
|
|
|
|
created_at: integer(), |
|
|
|
|
|
|
|
kind: integer(), |
|
|
|
|
|
|
|
tags: [[String.t()]], |
|
|
|
|
|
|
|
content: String.t(), |
|
|
|
|
|
|
|
sig: binary() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
@doc """ |
|
|
|
Converts a `GcIndexRelay.Nostr.PubEvent` to its corresponding `GcIndexRelay.Nostr.Event` and |
|
|
|
Converts a `GcIndexRelay.Nostr.PubEvent` to its corresponding `GcIndexRelay.Nostr.Event` and |
|
|
|
`GcIndexRelay.Nostr.Tag` representations. |
|
|
|
`GcIndexRelay.Nostr.Tag` representations. |
|
|
|
|
|
|
|
|
|
|
|
Returns an Ecto changeset for `GcIndexRelay.Nostr.Event`. |
|
|
|
Returns an Ecto for `GcIndexRelay.Nostr.Event`. |
|
|
|
""" |
|
|
|
""" |
|
|
|
|
|
|
|
@spec to_db(t()) :: Ecto.Schema.t() |
|
|
|
def to_db(%__MODULE__{tags: tags} = pub_event) do |
|
|
|
def to_db(%__MODULE__{tags: tags} = pub_event) do |
|
|
|
%Event{to_event(pub_event) | tags: to_tags(tags)} |
|
|
|
%Event{to_event(pub_event) | tags: to_tags(tags)} |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
defp to_event(%__MODULE__{ |
|
|
|
@spec to_event(t()) :: Ecto.Schema.t() |
|
|
|
id: id, |
|
|
|
defp to_event(%__MODULE__{} = pub_event) |
|
|
|
pubkey: pubkey, |
|
|
|
when is_binary(pub_event.id) and is_binary(pub_event.pubkey) and |
|
|
|
created_at: epoch, |
|
|
|
is_integer(pub_event.created_at) and is_integer(pub_event.kind) and |
|
|
|
kind: kind, |
|
|
|
is_binary(pub_event.sig) do |
|
|
|
content: content, |
|
|
|
with {:ok, id} <- Base.decode16(pub_event.id, case: :lower), |
|
|
|
sig: signature |
|
|
|
{:ok, pubkey} <- Base.decode16(pub_event.pubkey, case: :lower), |
|
|
|
}) |
|
|
|
{:ok, signature} <- Base.decode16(pub_event.sig, case: :lower) do |
|
|
|
when is_binary(id) and is_binary(pubkey) and is_integer(epoch) and is_integer(kind) and |
|
|
|
%Event{ |
|
|
|
is_binary(signature) do |
|
|
|
id: id, |
|
|
|
%Event{ |
|
|
|
pubkey: pubkey, |
|
|
|
id: Base.decode16(id, case: :lower), |
|
|
|
created_at: DateTime.from_unix!(pub_event.created_at), |
|
|
|
pubkey: Base.decode16(pubkey, case: :lower), |
|
|
|
kind: pub_event.kind, |
|
|
|
created_at: DateTime.from_unix!(epoch), |
|
|
|
content: pub_event.content, |
|
|
|
kind: kind, |
|
|
|
sig: signature |
|
|
|
content: content, |
|
|
|
} |
|
|
|
sig: Base.decode16(signature, case: :lower) |
|
|
|
else |
|
|
|
} |
|
|
|
error -> {:error, error} |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@spec to_tags([[String.t()]]) :: [Ecto.Schema.t()] |
|
|
|
defp to_tags(tags) when is_list(tags) do |
|
|
|
defp to_tags(tags) when is_list(tags) do |
|
|
|
for t <- tags, do: to_tag(t) |
|
|
|
for t <- tags do |
|
|
|
end |
|
|
|
[name | values] = t |
|
|
|
|
|
|
|
# Single-element tags will cause a crash |
|
|
|
defp to_tag(tag) when is_list(tag) do |
|
|
|
[value | rest] = values |
|
|
|
[name | values] = tag |
|
|
|
|
|
|
|
[value | rest] = values |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%Tag{ |
|
|
|
%Tag{ |
|
|
|
name: name, |
|
|
|
name: name, |
|
|
|
value: value, |
|
|
|
value: value, |
|
|
|
additional_values: rest |
|
|
|
additional_values: rest |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
@doc """ |
|
|
|
@doc """ |
|
|
|
Converts the DB representations of `GcIndexRelay.Nostr.Event` and `GcIndexRelay.Nostr.Tag` to the |
|
|
|
Converts the DB representations of `GcIndexRelay.Nostr.Event` and `GcIndexRelay.Nostr.Tag` to the |
|
|
|
domain representation `GcIndexRelay.Nostr.PubEvent`. |
|
|
|
domain representation `GcIndexRelay.Nostr.PubEvent`. |
|
|
|
""" |
|
|
|
""" |
|
|
|
|
|
|
|
@spec from_db(struct()) :: {:ok, t()} | {:error, :not_found} |
|
|
|
|
|
|
|
def from_db(event) when is_nil(event), do: {:error, :not_found} |
|
|
|
|
|
|
|
|
|
|
|
def from_db(%Event{tags: tags} = event) when is_struct(event, Event) and is_list(tags) do |
|
|
|
def from_db(%Event{tags: tags} = event) when is_struct(event, Event) and is_list(tags) do |
|
|
|
%{from_event(event) | tags: from_tags(tags)} |
|
|
|
{:ok, %{from_event(event) | tags: from_tags(tags)}} |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
defp from_event(%Event{} = event) when is_struct(event, Event) do |
|
|
|
defp from_event(%Event{} = event) when is_struct(event, Event) do |
|
|
|
@ -77,11 +92,6 @@ defmodule GcIndexRelay.Nostr.PubEvent do |
|
|
|
end |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
defp from_tags(tags) when is_list(tags) do |
|
|
|
defp from_tags(tags) when is_list(tags) do |
|
|
|
for t <- tags, do: from_tag(t) |
|
|
|
for t <- tags, do: [t.name, t.value | t.additional_values] |
|
|
|
end |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defp from_tag(%Tag{name: name, value: value, additional_values: rest}) |
|
|
|
|
|
|
|
when is_binary(name) and is_binary(value) and is_list(rest) do |
|
|
|
|
|
|
|
[name | [value | rest]] |
|
|
|
|
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
end |
|
|
|
|