caslu

caslu

Hello everyone, I’m building a collaborative editor where users can belong to multiple teams. I’ve decided to set up multi-tenancy on my user resource using the context strategy. So far, so good. However, Ash’s default behavior seems to require a team to be created before a user can be created and associated with it. This makes sense in general, but I need a different approach.

If you look at Notion, Figma, Vercel, Supabase, and many other applications with a “team” (organization, group, etc.) architecture, you’ll notice that they often register the user first. Then, the application creates a default organization, often using the user’s username, name, or other information.

Is there a way to adapt Ash’s expected flow to achieve this pattern? Something like:

User registration → Onboarding → Create user organization → Redirect to app home

I realize this is likely more of a design consideration than an Ash issue. If anyone has already tackled and solved this, I’d greatly appreciate any help. Thanks again, everyone! :smile:

Showing Posts 1 to 10

zachdaniel

zachdaniel

Creator of Ash

My suggestion would be to create the users organization immediately on register, and then allow them to update/customize it after the fact. You can attach before/after action hooks to the register action for example.

caslu

caslu OP

Zach, i’ve also noticed that i’m not being able to register user with the default setup for magic link, do i have to make some tweak ? I am using ash with Inertia, therefore i am dispatching action by myself, here’s a snippet from my auth_controller

  def magic_link_request(conn, user_params) do
    strategy = Info.strategy!(User, :magic_link)

    case Strategy.action(strategy, :request, user_params) do
      :ok ->
        redirect(conn, to: ~p"/login")

      {:error, _} ->
        conn
        |> put_flash(:error, "Failed to send magic link")
        |> redirect(to: ~p"/login")
    end
  end

After doing a multi-tenancy setup the emails aren’t being send anymore, can you help with this ?

zachdaniel

zachdaniel

Creator of Ash

You’ll need to make sure that you’re passing the tenant option. Additionally, we are releasing some fixes for multi tenancy + Ash Authentication shortly.

caslu

caslu OP

Yeah i got it but in that case i am just requesting the magic link, the user was not created yet so i cannot create an organization for this user yet, so there’s no tenant option to use (following your suggestion in above answer). So can it be adapted ?

zachdaniel

zachdaniel

Creator of Ash

Ah, sorry was a bit distracted and didn’t realize this was the same thread.

You can create an organization right there in that handler if one doesn’t exist yet for that user, and then you can set the tenant on the action. If you want to do it transactionally in the case that something goes wrong.

action :send_magic_link_request do
  transaction? true
  argument :user_params, :map, allow_nil?: false

  run fn input, _ ->
    # get org for users email
    # if it doesn't exist, make it
    org = get_or_create_org(...)
    strategy = Info.strategy!(User, :magic_link)

    Strategy.action(strategy, :request, input.arguments.user_params, tenant: org)
  end
end

Then you can call that generic action from your controller.

caslu

caslu OP

Does Token resource also needs to have a multitenancy block declaration in order to work with authentication ?

zachdaniel

zachdaniel

Creator of Ash

If your users resource is multitenant, your token resource likely should be as well.

caslu

caslu OP

Apologies for the delayed response. I didn’t see your reply earlier. My question is: Doesn’t it make more sense to set global? true on the users and token resources and then handle authentication separately from team creation?

zachdaniel

zachdaniel

Creator of Ash

It could. I’m not sure if I’d say it makes “more” sense necessarily though. I like having fewer invariants in my system. i.e if “all users always have an org” that is simpler than “users have an org except for a few minutes after they sign up and before they create their org”. You’d end up dealing with the fact that not all users have an org in a bunch of places.

caslu

caslu OP

This worked pretty well, thanks again zach

— All posts loaded —

Where Next? Top

Trending in Questions Top

water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
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
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
Alvinkariuki
How Can I Optimise Compile Time Dependencies I have been building an elixir application for about 2 years now. Many modules and files ha...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New

Other Trending Topics Top

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
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews