Skip to content

Commit

Permalink
Spike renaming owner and ownership relationships to plural versions
Browse files Browse the repository at this point in the history
  • Loading branch information
zoldar committed Jan 29, 2025
1 parent 204fe9d commit b224b8f
Show file tree
Hide file tree
Showing 34 changed files with 164 additions and 145 deletions.
15 changes: 9 additions & 6 deletions lib/plausible/billing/billing.ex
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ defmodule Plausible.Billing do
subscription =
Subscription
|> Repo.get_by(paddle_subscription_id: params["subscription_id"])
|> Repo.preload(team: :owner)
|> Repo.preload(team: :owners)

if subscription do
changeset =
Expand All @@ -99,9 +99,11 @@ defmodule Plausible.Billing do

updated = Repo.update!(changeset)

subscription.team.owner
|> PlausibleWeb.Email.cancellation_email()
|> Plausible.Mailer.send()
for owner <- subscription.team.owners do
owner
|> PlausibleWeb.Email.cancellation_email()
|> Plausible.Mailer.send()
end

updated
end
Expand Down Expand Up @@ -212,7 +214,7 @@ defmodule Plausible.Billing do
Teams.Team
|> Repo.get!(subscription.team_id)
|> Teams.with_subscription()
|> Repo.preload(:owner)
|> Repo.preload(:owners)

if subscription.id != team.subscription.id do
Sentry.capture_message("Susbscription ID mismatch",
Expand All @@ -236,7 +238,8 @@ defmodule Plausible.Billing do
)

if plan do
api_keys = from(key in Plausible.Auth.ApiKey, where: key.user_id == ^team.owner.id)
owner_ids = Enum.map(team.owners, & &1.id)
api_keys = from(key in Plausible.Auth.ApiKey, where: key.user_id in ^owner_ids)
Repo.update_all(api_keys, set: [hourly_request_limit: plan.hourly_api_request_limit])
end

Expand Down
8 changes: 4 additions & 4 deletions lib/plausible/billing/enterprise_plan_admin.ex
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ defmodule Plausible.Billing.EnterprisePlanAdmin do

from(r in query,
inner_join: t in assoc(r, :team),
inner_join: o in assoc(t, :owner),
inner_join: o in assoc(t, :owners),
or_where: ilike(r.paddle_plan_id, ^search_term),
or_where: ilike(o.email, ^search_term) or ilike(o.name, ^search_term),
preload: [team: {t, owner: o}]
preload: [team: {t, owners: o}]
)
end

def custom_show_query(_conn, _schema, query) do
from(ep in query,
inner_join: t in assoc(ep, :team),
inner_join: o in assoc(t, :owner),
inner_join: o in assoc(t, :owners),
select: %{ep | user_id: o.id}
)
end
Expand All @@ -68,7 +68,7 @@ defmodule Plausible.Billing.EnterprisePlanAdmin do
]
end

defp get_user_email(plan), do: plan.team.owner.email
defp get_user_email(plan), do: List.first(plan.team.owners).email

def create_changeset(schema, attrs) do
attrs = sanitize_attrs(attrs)
Expand Down
10 changes: 6 additions & 4 deletions lib/plausible/billing/site_locker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ defmodule Plausible.Billing.SiteLocker do
Plausible.Teams.end_grace_period(team)

if send_email? do
team = Repo.preload(team, :owner)
team = Repo.preload(team, :owners)
send_grace_period_end_email(team)
end

Expand Down Expand Up @@ -64,8 +64,10 @@ defmodule Plausible.Billing.SiteLocker do
usage = Teams.Billing.monthly_pageview_usage(team)
suggested_plan = Plausible.Billing.Plans.suggest(team, usage.last_cycle.total)

team.owner
|> PlausibleWeb.Email.dashboard_locked(usage, suggested_plan)
|> Plausible.Mailer.send()
for owner <- team.owners do
owner
|> PlausibleWeb.Email.dashboard_locked(usage, suggested_plan)
|> Plausible.Mailer.send()
end
end
end
4 changes: 2 additions & 2 deletions lib/plausible/site.ex
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ defmodule Plausible.Site do
has_one :google_auth, GoogleAuth
has_one :weekly_report, Plausible.Site.WeeklyReport
has_one :monthly_report, Plausible.Site.MonthlyReport
has_one :ownership, through: [:team, :ownership]
has_one :owner, through: [:team, :owner]
has_many :ownerships, through: [:team, :ownerships]
has_many :owners, through: [:team, :owners]

# If `from_cache?` is set, the struct might be incomplete - see `Plausible.Site.Cache`.
# Use `Plausible.Repo.reload!(cached_site)` to pre-fill missing fields if
Expand Down
32 changes: 17 additions & 15 deletions lib/plausible/site/admin.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ defmodule Plausible.SiteAdmin do

from(r in query,
as: :site,
inner_join: o in assoc(r, :owner),
inner_join: o in assoc(r, :owners),
inner_join: t in assoc(r, :team),
preload: [owner: o, team: t, guest_memberships: [team_membership: :user]],
preload: [owners: o, team: t, guest_memberships: [team_membership: :user]],
or_where: ilike(r.domain, ^search_term),
or_where: ilike(o.email, ^search_term),
or_where: ilike(o.name, ^search_term),
Expand Down Expand Up @@ -78,7 +78,7 @@ defmodule Plausible.SiteAdmin do
inserted_at: %{name: "Created at", value: &format_date(&1.inserted_at)},
timezone: nil,
public: nil,
owner: %{value: &get_owner/1},
owners: %{value: &get_owners/1},
other_members: %{value: &get_other_members/1},
limits: %{
value: fn site ->
Expand Down Expand Up @@ -186,20 +186,22 @@ defmodule Plausible.SiteAdmin do
Calendar.strftime(date, "%b %-d, %Y")
end

defp get_owner(site) do
owner = site.owner
defp get_owners(site) do
owners = Repo.preload(site, :owners).owners

if owner do
escaped_name = Phoenix.HTML.html_escape(owner.name) |> Phoenix.HTML.safe_to_string()
escaped_email = Phoenix.HTML.html_escape(owner.email) |> Phoenix.HTML.safe_to_string()
owners_html =
Enum.map(owners, fn owner ->
escaped_name = Phoenix.HTML.html_escape(owner.name) |> Phoenix.HTML.safe_to_string()
escaped_email = Phoenix.HTML.html_escape(owner.email) |> Phoenix.HTML.safe_to_string()

{:safe,
"""
<a href="/crm/auth/user/#{owner.id}">#{escaped_name}</a>
<br/><br/>
#{escaped_email}
"""}
end
"""
<a href="/crm/auth/user/#{owner.id}">#{escaped_name}</a>
<br/><br/>
#{escaped_email}
"""
end)

{:safe, Enum.join(owners_html, "<br/><br/>")}
end

defp get_other_members(site) do
Expand Down
8 changes: 4 additions & 4 deletions lib/plausible/site/memberships/accept_invitation.ex
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@ defmodule Plausible.Site.Memberships.AcceptInvitation do
:ok <- check_can_transfer_site(new_team, new_owner),
:ok <- Teams.Invitations.ensure_can_take_ownership(site, new_team),
:ok <- Teams.Invitations.transfer_site(site, new_team) do
site = site |> Repo.reload!() |> Repo.preload(ownership: :user)
site = site |> Repo.reload!() |> Repo.preload(ownerships: :user)

{:ok, site.ownership}
{:ok, site.ownerships}
end
end

Expand All @@ -96,9 +96,9 @@ defmodule Plausible.Site.Memberships.AcceptInvitation do
:ok <- Teams.Invitations.accept_site_transfer(site_transfer, new_team) do
Teams.Invitations.send_transfer_accepted_email(site_transfer)

site = site |> Repo.reload!() |> Repo.preload(ownership: :user)
site = site |> Repo.reload!() |> Repo.preload(ownerships: :user)

{:ok, %{team: new_team, team_membership: site.ownership, site: site}}
{:ok, %{team: new_team, team_memberships: site.ownerships, site: site}}
end
end

Expand Down
2 changes: 1 addition & 1 deletion lib/plausible/site/memberships/create_invitation.ex
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ defmodule Plausible.Site.Memberships.CreateInvitation do
end

defp do_invite(site, inviter, invitee_email, role, opts \\ []) do
with site <- Repo.preload(site, [:owner, :team]),
with site <- Repo.preload(site, [:owners, :team]),
:ok <-
Teams.Invitations.check_invitation_permissions(
site,
Expand Down
11 changes: 1 addition & 10 deletions lib/plausible/teams.ex
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,6 @@ defmodule Plausible.Teams do
Repo.get_by!(Teams.Team, identifier: team_identifier)
end

@spec get_owner(Teams.Team.t()) ::
{:ok, Auth.User.t()} | {:error, :no_owner | :multiple_owners}
def get_owner(team) do
case Repo.preload(team, :owner).owner do
nil -> {:error, :no_owner}
owner_user -> {:ok, owner_user}
end
end

@spec on_trial?(Teams.Team.t() | nil) :: boolean()
on_ee do
def on_trial?(nil), do: false
Expand Down Expand Up @@ -264,7 +255,7 @@ defmodule Plausible.Teams do
end

def setup_team(team, candidates) do
inviter = Repo.preload(team, :owner).owner
[inviter | _] = Repo.preload(team, :owners).owners

setup_team_fn = fn {{email, _name}, role} ->
case Teams.Invitations.InviteToTeam.invite(team, inviter, email, role, send_email?: false) do
Expand Down
2 changes: 1 addition & 1 deletion lib/plausible/teams/billing.ex
Original file line number Diff line number Diff line change
Expand Up @@ -382,7 +382,7 @@ defmodule Plausible.Teams.Billing do
def team_member_usage(nil, _), do: 0

def team_member_usage(team, opts) do
{:ok, owner} = Teams.get_owner(team)
[owner | _] = Repo.preload(team, :owners).owners
exclude_emails = Keyword.get(opts, :exclude_emails, []) ++ [owner.email]

pending_site_ids = Keyword.get(opts, :pending_ownership_site_ids, [])
Expand Down
26 changes: 14 additions & 12 deletions lib/plausible/teams/invitations.ex
Original file line number Diff line number Diff line change
Expand Up @@ -324,7 +324,7 @@ defmodule Plausible.Teams.Invitations do
site =
Repo.preload(site, [
:team,
:owner,
:owners,
guest_memberships: [team_membership: :user],
guest_invitations: [team_invitation: :inviter]
])
Expand Down Expand Up @@ -381,19 +381,21 @@ defmodule Plausible.Teams.Invitations do
Repo.delete_all(from gm in Teams.GuestMembership, where: gm.id in ^old_guest_ids)
:ok = Teams.Memberships.prune_guests(prior_team)

{:ok, prior_owner} = Teams.get_owner(prior_team)
prior_owners = Repo.preload(prior_team, :owners).owners

{:ok, prior_owner_team_membership} = create_team_membership(team, :guest, prior_owner, now)
for prior_owner <- prior_owners do
{:ok, prior_owner_team_membership} = create_team_membership(team, :guest, prior_owner, now)

if prior_owner_team_membership.role == :guest do
{:ok, _} =
prior_owner_team_membership
|> Teams.GuestMembership.changeset(site, :editor)
|> Repo.insert(
on_conflict: [set: [updated_at: now, role: :editor]],
conflict_target: [:team_membership_id, :site_id],
returning: true
)
if prior_owner_team_membership.role == :guest do
{:ok, _} =
prior_owner_team_membership
|> Teams.GuestMembership.changeset(site, :editor)
|> Repo.insert(
on_conflict: [set: [updated_at: now, role: :editor]],
conflict_target: [:team_membership_id, :site_id],
returning: true
)
end
end

on_ee do
Expand Down
2 changes: 1 addition & 1 deletion lib/plausible/teams/invitations/invite_to_team.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ defmodule Plausible.Teams.Invitations.InviteToTeam do
def invite(team, inviter, invitee_email, role, opts \\ [])

def invite(team, inviter, invitee_email, role, opts) when role in @valid_roles do
with team <- Repo.preload(team, [:owner]),
with team <- Repo.preload(team, [:owners]),
:ok <-
Teams.Invitations.check_invitation_permissions(
team,
Expand Down
2 changes: 0 additions & 2 deletions lib/plausible/teams/team.ex
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,6 @@ defmodule Plausible.Teams.Team do
has_one :subscription, Plausible.Billing.Subscription
has_one :enterprise_plan, Plausible.Billing.EnterprisePlan

has_one :ownership, Plausible.Teams.Membership, where: [role: :owner]
has_one :owner, through: [:ownership, :user]
has_many :ownerships, Plausible.Teams.Membership, where: [role: :owner]
has_many :owners, through: [:ownerships, :user]

Expand Down
4 changes: 2 additions & 2 deletions lib/plausible_web/controllers/admin_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ defmodule PlausibleWeb.AdminController do
{:ok, team} ->
team
|> Teams.with_subscription()
|> Plausible.Repo.preload(:owner)
|> Plausible.Repo.preload(:owners)

{:error, :no_team} ->
nil
Expand Down Expand Up @@ -177,7 +177,7 @@ defmodule PlausibleWeb.AdminController do

sites_link =
Routes.kaffy_resource_url(PlausibleWeb.Endpoint, :index, :sites, :site,
custom_search: team.owner.email
custom_search: List.first(team.owners).email
)

"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ defmodule PlausibleWeb.Api.ExternalQueryApiController do
alias Plausible.Stats.Query

def query(conn, params) do
site = Repo.preload(conn.assigns.site, :owner)
site = Repo.preload(conn.assigns.site, :owners)

case Query.build(site, conn.assigns.schema_type, params, debug_metadata(conn)) do
{:ok, query} ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do
end

def aggregate(conn, params) do
site = Repo.preload(conn.assigns.site, :owner)
site = Repo.preload(conn.assigns.site, :owners)

params = Map.put(params, "property", nil)

Expand Down Expand Up @@ -38,7 +38,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do
end

def breakdown(conn, params) do
site = Repo.preload(conn.assigns.site, :owner)
site = Repo.preload(conn.assigns.site, :owners)

with :ok <- validate_period(params),
:ok <- validate_date(params),
Expand Down Expand Up @@ -246,7 +246,7 @@ defmodule PlausibleWeb.Api.ExternalStatsController do
defp event_only_property?(_), do: false

def timeseries(conn, params) do
site = Repo.preload(conn.assigns.site, :owner)
site = Repo.preload(conn.assigns.site, :owners)

params = Map.put(params, "property", nil)

Expand Down
4 changes: 2 additions & 2 deletions lib/plausible_web/controllers/site/membership_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ defmodule PlausibleWeb.Site.MembershipController do
site =
conn.assigns.current_user
|> Plausible.Sites.get_for_user!(conn.assigns.site.domain)
|> Plausible.Repo.preload(:owner)
|> Plausible.Repo.preload(:owners)

limit = Plausible.Teams.Billing.team_member_limit(site.team)
usage = Plausible.Teams.Billing.team_member_usage(site.team)
Expand All @@ -48,7 +48,7 @@ defmodule PlausibleWeb.Site.MembershipController do

site =
Plausible.Sites.get_for_user!(conn.assigns.current_user, site_domain)
|> Plausible.Repo.preload(:owner)
|> Plausible.Repo.preload(:owners)

case Memberships.create_invitation(site, conn.assigns.current_user, email, role) do
{:ok, invitation} ->
Expand Down
Loading

0 comments on commit b224b8f

Please sign in to comment.