Skip to content

Commit

Permalink
refactor(post-by-username): wip implement post by username
Browse files Browse the repository at this point in the history
  • Loading branch information
akinsey committed Oct 14, 2024
1 parent a0a0ab1 commit a2cdf5f
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 4 deletions.
66 changes: 66 additions & 0 deletions lib/epochtalk_server_web/controllers/post.ex
Original file line number Diff line number Diff line change
Expand Up @@ -358,6 +358,51 @@ defmodule EpochtalkServerWeb.Controllers.Post do
end
end

@doc """
Used to retrieve `Posts` for a `User` by username
"""
def by_username(conn, attrs) do
# Parameter Validation
with username <- attrs["username"],
page <- Validate.cast(attrs, "page", :integer, default: 1, min: 1),
limit <- Validate.cast(attrs, "limit", :integer, default: 25, min: 1, max: 100),
desc <- Validate.cast(attrs, "desc", :boolean, default: true),
user <- Guardian.Plug.current_resource(conn),
priority <- ACL.get_user_priority(conn),
[lookup_user] <- User.ids_from_usernames([username]),

# Authorizations Checks
:ok <- ACL.allow!(conn, "posts.pageByUser"),
{:user_not_deleted, user_not_deleted} <-
{:user_not_deleted, User.is_active?(lookup_user.id)},
{:has_deleted_override, has_deleted_override} <-
{:has_deleted_override, ACL.has_permission(conn, "posts.pageByUser.bypass.viewDeletedUsers")},
{:view_deleted_users, true} <- {:view_deleted_users, user_not_deleted || has_deleted_override},
view_deleted_posts <- can_authed_user_view_deleted_posts_by_username(user),
posts <-
Post.page_by_username(username, priority, page,
per_page: limit,
desc: desc
),
{:has_posts, true} <- {:has_posts, posts != []} do
render(conn, :by_username, %{
posts: posts,
user: user,
priority: priority,
view_deleted_posts: view_deleted_posts
})
else
{:has_posts, false} ->
ErrorHelpers.render_json_error(conn, 404, "Error, requested posts not found")

{:view_deleted_users, false} ->
ErrorHelpers.render_json_error(conn, 400, "Account not found")

_ ->
ErrorHelpers.render_json_error(conn, 400, "Error, cannot get posts by username")
end
end

@doc """
Get `Post` preview by running content through parser
"""
Expand Down Expand Up @@ -402,6 +447,27 @@ defmodule EpochtalkServerWeb.Controllers.Post do
end
end

defp can_authed_user_view_deleted_posts_by_username(nil), do: false

defp can_authed_user_view_deleted_posts_by_username(user) do
view_all = ACL.has_permission(user, "posts.byUsername.bypass.viewDeletedPosts.admin")
view_some = ACL.has_permission(user, "posts.byUsername.bypass.viewDeletedPosts.mod")

user_id = Map.get(user, :id)
moderated_boards = BoardModerator.get_user_moderated_boards(user_id)

cond do
view_all ->
true

view_some and moderated_boards != [] ->
moderated_boards

true ->
false
end
end

defp can_authed_user_bypass_thread_lock_on_post_create(user, thread_id),
do:
ACL.bypass_post_owner(
Expand Down
18 changes: 14 additions & 4 deletions lib/epochtalk_server_web/json/post_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,15 @@ defmodule EpochtalkServerWeb.Controllers.PostJSON do
}
end

@doc """
Renders all `Post` for a particular `User`.
"""
def by_username(%{posts: posts, user: user, priority: priority, view_deleted_posts: view_deleted_posts}) do
posts
|> Enum.map(&(Map.put(&1, :body_html, &1.body) |> Map.delete(:body)))
|> handle_deleted_posts(nil, user, priority, view_deleted_posts)
end

## === Private Helper Functions ===

defp handle_deleted_posts(posts, thread, user, authed_user_priority, view_deleted_posts) do
Expand Down Expand Up @@ -145,13 +154,12 @@ defmodule EpochtalkServerWeb.Controllers.PostJSON do
viewable_in_board_with_id
) do
# check if metadata map exists
metadata_map_exists = !!post.metadata and Map.keys(post.metadata) != []
metadata_map_exists = !!Map.get(post, :metadata) and Map.keys(post.metadata) != []

# get information about how current post was hidden
post_hidden_by_priority =
if metadata_map_exists && post.metadata["hidden_by_priority"] != nil,
do: post.metadata["hidden_by_priority"],
else: post.user.priority
do: post.metadata["hidden_by_priority"]

post_hidden_by_id =
if metadata_map_exists && post.metadata["hidden_by_id"] != nil,
Expand All @@ -160,7 +168,9 @@ defmodule EpochtalkServerWeb.Controllers.PostJSON do

# check if user has priority to view hidden post,
# or if the user was the one who hid the post
authed_user_has_priority = authed_user_priority <= post_hidden_by_priority
authed_user_has_priority = if is_nil(post_hidden_by_priority),
do: false,
else: authed_user_priority <= post_hidden_by_priority
authed_user_hid_post = post_hidden_by_id == authed_user_id

post_is_viewable =
Expand Down
1 change: 1 addition & 0 deletions lib/epochtalk_server_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ defmodule EpochtalkServerWeb.Router do
get "/breadcrumbs", Breadcrumb, :breadcrumbs
get "/users/:username", User, :find
get "/posts", Post, :by_thread
get "/posts/user/:username", Post, :by_username
get "/threads", Thread, :by_board
get "/threads/:slug/id", Thread, :slug_to_id
post "/threads/:id/viewed", Thread, :viewed
Expand Down

0 comments on commit a2cdf5f

Please sign in to comment.