An example AT Protocol application, written in Elixir using atex and Drinkup.
1defmodule Statusphere.Consumer do
2 alias Statusphere.Repo
3 require Logger
4 use Drinkup.RecordConsumer, collections: ["xyz.statusphere.status"]
5
6 def handle_create(record), do: upsert(record)
7
8 def handle_update(record), do: upsert(record)
9
10 def handle_delete(record) do
11 IO.inspect(record, label: "delete")
12 end
13
14 defp upsert(%{type: "xyz.statusphere.status", record: record} = evt) do
15 case Xyz.Statusphere.Status.from_json(record) do
16 {:ok, record} ->
17 uri =
18 Atex.AtURI.to_string(%Atex.AtURI{
19 authority: evt.did,
20 collection: evt.type,
21 rkey: evt.rkey
22 })
23
24 status =
25 %Statusphere.Status{}
26 |> Statusphere.Status.changeset(%{
27 uri: uri,
28 author_did: evt.did,
29 status: record.status,
30 created_at: NaiveDateTime.from_iso8601!(record.createdAt),
31 indexed_at: NaiveDateTime.utc_now()
32 })
33 |> Repo.insert!(
34 on_conflict: [set: [status: record.status, indexed_at: NaiveDateTime.utc_now()]],
35 conflict_target: :uri
36 )
37
38 Logger.debug("ingested status: #{inspect(status)}")
39
40 _ ->
41 nil
42 end
43 end
44
45 defp upsert(_), do: nil
46end