An example AT Protocol application, written in Elixir using atex and Drinkup.
at main 46 lines 1.3 kB view raw
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