jbcaprell

jbcaprell

In their Phoenix LiveView course (which is excellent!), the Pragmatic Studio guys define a function in a Phoenix context, LiveViewStudio.Volunteers.broadcast/2, like this:

def broadcast({:ok, volunteer}, event) do
  Phoenix.PubSub.broadcast(
    LiveViewStudio.PubSub,
    "volunteers",
    {event, volunteer}
  )

  {:ok, volunteer}
end

… which they then append to the write functions for that Phoenix context, as with LiveViewStudio.Volunteers.update_volunteer/2:

def update_volunteer(%Volunteer{} = volunteer, attrs) do
  volunteer
  |> Volunteer.changeset(attrs)
  |> Repo.update()
  |> broadcast(:volunteer_updated)
end

… which they use to implement real-time updates in a LiveView; and this general pattern strikes me as preferable to the absinthe way of doing things, which is to use a Absinthe.Schema.Notation.trigger/2 macro, because the message is sent every time the context function is invoked, rather than ‘just’ when a GraphQL mutation is run.

I would like to continue giving PubSub messages to both the GraphQL subscription and to the LiveView, and I would also like for each to catch events given to the other; I think that I can add an additional call to Absinthe.Subscription.publish/3 to the aforementioned LiveViewStudio.Volunteers.broadcast/2 function, like this:

def broadcast({:ok, volunteer}, event) do
  Phoenix.PubSub.broadcast(
    LiveViewStudio.PubSub,
    "volunteers",
    {event, volunteer}
  )

  Absinthe.Subscription.publish(
    LiveViewStudioWeb.Endpoint,
    volunteer,
    change_volunteers: "volunteers"
  )

  {:ok, volunteer}
end

It seems like absinthe shards the topics you give it (to avoid collision?), but it seems like it would maybe be better if I could just give the ‘naked’ topic to Absinthe.Schema.Notation.config/1, rather than sending out two different messages. Is that possible, or am I ‘stuck’ sending two events?

Showing Posts 1 to 1

RodolfoSilva

RodolfoSilva

@jbcaprell have you found a solution for this?

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews