@@ -10,6 +10,7 @@ defmodule EpochtalkServerWeb.Controllers.Post do
1010 alias EpochtalkServerWeb.Helpers.ACL
1111 alias EpochtalkServerWeb.Helpers.Sanitize
1212 alias EpochtalkServerWeb.Helpers.Parse
13+ alias EpochtalkServer.Models.Profile
1314 alias EpochtalkServer.Models.Post
1415 alias EpochtalkServer.Models.Poll
1516 alias EpochtalkServer.Models.Thread
@@ -358,6 +359,58 @@ defmodule EpochtalkServerWeb.Controllers.Post do
358359 end
359360 end
360361
362+ @ doc """
363+ Used to retrieve `Posts` for a `User` by username
364+ """
365+ def by_username ( conn , attrs ) do
366+ # Parameter Validation
367+ with username <- attrs [ "username" ] ,
368+ page <- Validate . cast ( attrs , "page" , :integer , default: 1 , min: 1 ) ,
369+ limit <- Validate . cast ( attrs , "limit" , :integer , default: 25 , min: 1 , max: 100 ) ,
370+ desc <- Validate . cast ( attrs , "desc" , :boolean , default: true ) ,
371+ user <- Guardian.Plug . current_resource ( conn ) ,
372+ priority <- ACL . get_user_priority ( conn ) ,
373+ [ lookup_user ] <- User . ids_from_usernames ( [ username ] ) ,
374+
375+ # Authorizations Checks
376+ :ok <- ACL . allow! ( conn , "posts.pageByUser" ) ,
377+ { :user_not_deleted , user_not_deleted } <-
378+ { :user_not_deleted , User . is_active? ( lookup_user . id ) } ,
379+ { :has_deleted_override , has_deleted_override } <-
380+ { :has_deleted_override ,
381+ ACL . has_permission ( conn , "posts.pageByUser.bypass.viewDeletedUsers" ) } ,
382+ { :view_deleted_users , true } <-
383+ { :view_deleted_users , user_not_deleted || has_deleted_override } ,
384+ view_deleted_posts <- can_authed_user_view_deleted_posts_by_username ( user ) ,
385+ posts <-
386+ Post . page_by_username ( username , priority , page ,
387+ per_page: limit ,
388+ desc: desc
389+ ) ,
390+ count <- Profile . post_count_by_username ( username ) ,
391+ { :has_posts , true } <- { :has_posts , posts != [ ] } do
392+ render ( conn , :by_username , % {
393+ posts: posts ,
394+ user: user ,
395+ priority: priority ,
396+ view_deleted_posts: view_deleted_posts ,
397+ count: count ,
398+ limit: limit ,
399+ page: page ,
400+ desc: desc
401+ } )
402+ else
403+ { :has_posts , false } ->
404+ ErrorHelpers . render_json_error ( conn , 404 , "Error, requested posts not found" )
405+
406+ { :view_deleted_users , false } ->
407+ ErrorHelpers . render_json_error ( conn , 400 , "Account not found" )
408+
409+ _ ->
410+ ErrorHelpers . render_json_error ( conn , 400 , "Error, cannot get posts by username" )
411+ end
412+ end
413+
361414 @ doc """
362415 Get `Post` preview by running content through parser
363416 """
@@ -374,6 +427,29 @@ defmodule EpochtalkServerWeb.Controllers.Post do
374427 end
375428 end
376429
430+ ## === Public Authorization Helper Functions ===
431+
432+ def can_authed_user_view_deleted_posts_by_username ( nil ) , do: false
433+
434+ def can_authed_user_view_deleted_posts_by_username ( user ) do
435+ view_all = ACL . has_permission ( user , "posts.pageByUser.bypass.viewDeletedPosts.admin" )
436+ view_some = ACL . has_permission ( user , "posts.pageByUser.bypass.viewDeletedPosts.mod" )
437+
438+ user_id = Map . get ( user , :id )
439+ moderated_boards = BoardModerator . get_user_moderated_boards ( user_id )
440+
441+ cond do
442+ view_all ->
443+ true
444+
445+ view_some and moderated_boards != [ ] ->
446+ moderated_boards
447+
448+ true ->
449+ false
450+ end
451+ end
452+
377453 ## === Private Authorization Helper Functions ===
378454
379455 defp can_authed_user_view_deleted_posts ( nil , _thread_id ) , do: false
0 commit comments