@@ -512,6 +512,67 @@ defmodule EpochtalkServerWeb.Controllers.Thread do
512512 end
513513 end
514514
515+ @ doc """
516+ Used to move a `Thread`
517+ """
518+ def move ( conn , attrs ) do
519+ with user <- Guardian.Plug . current_resource ( conn ) ,
520+ thread_id <- Validate . cast ( attrs , "thread_id" , :integer , required: true ) ,
521+ new_board_id <- Validate . cast ( attrs , "new_board_id" , :integer , required: true ) ,
522+ :ok <- ACL . allow! ( conn , "threads.move" ) ,
523+ user_priority <- ACL . get_user_priority ( conn ) ,
524+ { :can_read , { :ok , true } } <-
525+ { :can_read , Board . get_read_access_by_thread_id ( thread_id , user_priority ) } ,
526+ { :can_write , { :ok , true } } <-
527+ { :can_write , Board . get_write_access_by_thread_id ( thread_id , user_priority ) } ,
528+ { :is_active , true } <-
529+ { :is_active , User . is_active? ( user . id ) } ,
530+ { :board_banned , { :ok , false } } <-
531+ { :board_banned , BoardBan . banned_from_board? ( user , thread_id: thread_id ) } ,
532+ { :bypass_thread_owner , true } <-
533+ { :bypass_thread_owner , can_authed_user_bypass_owner_on_thread_move ( user , thread_id ) } ,
534+ { :ok , old_board_data } <- Thread . move ( thread_id , new_board_id ) do
535+ render ( conn , :move , old_board_data: old_board_data )
536+ else
537+ { :can_read , { :ok , false } } ->
538+ ErrorHelpers . render_json_error (
539+ conn ,
540+ 403 ,
541+ "Unauthorized, you do not have permission to read"
542+ )
543+
544+ { :can_write , { :ok , false } } ->
545+ ErrorHelpers . render_json_error (
546+ conn ,
547+ 403 ,
548+ "Unauthorized, you do not have permission to write"
549+ )
550+
551+ { :bypass_thread_owner , false } ->
552+ ErrorHelpers . render_json_error (
553+ conn ,
554+ 403 ,
555+ "Unauthorized, you do not have permission to move another user's thread"
556+ )
557+
558+ { :board_banned , { :ok , true } } ->
559+ ErrorHelpers . render_json_error ( conn , 403 , "Unauthorized, you are banned from this board" )
560+
561+ { :is_active , false } ->
562+ ErrorHelpers . render_json_error (
563+ conn ,
564+ 400 ,
565+ "Account must be active to move thread"
566+ )
567+
568+ { :error , data } ->
569+ ErrorHelpers . render_json_error ( conn , 400 , data )
570+
571+ _ ->
572+ ErrorHelpers . render_json_error ( conn , 400 , "Error, cannot move thread" )
573+ end
574+ end
575+
515576 @ doc """
516577 Used to convert `Thread` slug to id
517578 """
@@ -685,4 +746,18 @@ defmodule EpochtalkServerWeb.Controllers.Thread do
685746 true
686747 )
687748 end
749+
750+ defp can_authed_user_bypass_owner_on_thread_move ( user , thread_id ) do
751+ post = Thread . get_first_post_data_by_id ( thread_id )
752+
753+ ACL . bypass_post_owner (
754+ user ,
755+ post ,
756+ "threads.move" ,
757+ "owner" ,
758+ false ,
759+ true ,
760+ true
761+ )
762+ end
688763end
0 commit comments