Pattern Matching for params with different names in different situations

Hello all, for background I’m using Phoenix and writing a plug to handle authorization for different routes in the app.

I’m testing to see if a user is a member of an organization for the organization resource and several other nested resources.

pipeline :organization_members_only do
  plug :user_is_organization_member
end

scope "/" do
  pipe_through :organization_members_only
  resource "/organizations/", OrganizationController do
    resources "/events", EventController
    resources "/tools", ToolController
    resources "/contents", ContentController
  end
end

The conn variable holds the path params, which I am pattern matching to get the ID of the organization and check with a list of the user’s organizations.

%{"id" => id, "organization_id" => organization_id} = conn.path_params
if organization_id == nil do
  String.to_integer(id)
else
  String.to_integer(organization_id)
end

So the issue is, sometimes the organization_id is stored in the path_params as “id” and sometimes it is stored as “organization_id”

How do I pattern match in this situation?

You would write a case or multiple function clauses to extract the id:

def user_is_organization_member(conn, _opts) do
  organization_id =
    conn.path_params
    |> extract_organization_id()
    |> String.to_integer()

  # Do something with it ...
end

def extract_organization_id(%{"organization_id" => id}), do: id
def extract_organization_id(%{"id" => id}), do: id
1 Like