field(:password_hash, :string)
field(:password, :string, virtual: true)
field(:password_confirmation, :string, virtual: true)
+ field(:keys, :string)
field(:following, {:array, :string}, default: [])
field(:ap_id, :string)
field(:avatar, :map)
unread_query = Participation.unread_conversation_count_for_user(user)
User
- |> where([u], u.id == ^user.id)
|> join(:inner, [u], p in subquery(unread_query))
|> update([u, p],
set: [
)
]
)
+ |> where([u], u.id == ^user.id)
|> select([u], u)
|> Repo.update_all([])
|> case do
- {1, [%{info: %User.Info{}} = user]} -> set_cache(user)
+ {1, [user]} -> set_cache(user)
_ -> {:error, user}
end
end
set: [
info:
fragment(
- "jsonb_set(?, '{unread_conversation_count}', ((?->>'unread_conversation_count')::int + 1)::varchar::jsonb, true)",
+ "jsonb_set(?, '{unread_conversation_count}', (coalesce((?->>'unread_conversation_count')::int, 0) + 1)::varchar::jsonb, true)",
u.info,
u.info
)
|> select([u], u)
|> Repo.update_all([])
|> case do
- {1, [%{info: %User.Info{}} = user]} -> set_cache(user)
+ {1, [user]} -> set_cache(user)
_ -> {:error, user}
end
end
}
end
- def ensure_keys_present(%{info: %{keys: keys}} = user) when not is_nil(keys), do: {:ok, user}
+ def ensure_keys_present(%{keys: keys} = user) when not is_nil(keys), do: {:ok, user}
def ensure_keys_present(%User{} = user) do
with {:ok, pem} <- Keys.generate_rsa_pem() do
- update_info(user, &User.Info.set_keys(&1, pem))
+ user
+ |> cast(%{keys: pem}, [:keys])
+ |> validate_required([:keys])
+ |> update_and_set_cache()
end
end