+ from(u in User, where: u.local == true)
+ end
+
+ def deactivate(%User{} = user) do
+ new_info = Map.put(user.info, "deactivated", true)
+ cs = User.info_changeset(user, %{info: new_info})
+ update_and_set_cache(cs)
+ end
+
+ def delete(%User{} = user) do
+ {:ok, user} = User.deactivate(user)
+
+ # Remove all relationships
+ {:ok, followers} = User.get_followers(user)
+
+ followers
+ |> Enum.each(fn follower -> User.unfollow(follower, user) end)
+
+ {:ok, friends} = User.get_friends(user)
+
+ friends
+ |> Enum.each(fn followed -> User.unfollow(user, followed) end)
+
+ query = from(a in Activity, where: a.actor == ^user.ap_id)
+
+ Repo.all(query)
+ |> Enum.each(fn activity ->
+ case activity.data["type"] do
+ "Create" ->
+ ActivityPub.delete(Object.get_by_ap_id(activity.data["object"]["id"]))
+
+ # TODO: Do something with likes, follows, repeats.
+ _ ->
+ "Doing nothing"
+ end
+ end)
+
+ :ok
+ end
+
+ def get_or_fetch_by_ap_id(ap_id) do
+ if user = get_by_ap_id(ap_id) do
+ user
+ else
+ ap_try = ActivityPub.make_user_from_ap_id(ap_id)
+
+ case ap_try do
+ {:ok, user} ->
+ user
+
+ _ ->
+ case OStatus.make_user(ap_id) do
+ {:ok, user} -> user
+ _ -> {:error, "Could not fetch by AP id"}
+ end
+ end
+ end