feat(errors): Introduce error variant for thread closing
(other minor change: log the user ID when invalid post editing requests were constructed)
This commit is contained in:
		
							parent
							
								
									c2a551146d
								
							
						
					
					
						commit
						a14ece6af3
					
				
					 2 changed files with 20 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -56,8 +56,11 @@ pub enum ConverseError {
 | 
			
		|||
    #[fail(display = "error occured running timer: {}", error)]
 | 
			
		||||
    Timer { error: tokio_timer::Error },
 | 
			
		||||
 | 
			
		||||
    #[fail(display = "user does not have permission to edit post {}", id)]
 | 
			
		||||
    PostEditForbidden { id: i32 },
 | 
			
		||||
    #[fail(display = "user {} does not have permission to edit post {}", user, id)]
 | 
			
		||||
    PostEditForbidden { user: i32, id: i32 },
 | 
			
		||||
 | 
			
		||||
    #[fail(display = "thread {} is closed and can not be responded to", id)]
 | 
			
		||||
    ThreadClosed { id: i32 },
 | 
			
		||||
 | 
			
		||||
    // This variant is used as a catch-all for wrapping
 | 
			
		||||
    // actix-web-compatible response errors, such as the errors it
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +122,12 @@ impl From<tokio_timer::Error> for ConverseError {
 | 
			
		|||
impl ResponseError for ConverseError {
 | 
			
		||||
    fn error_response(&self) -> HttpResponse {
 | 
			
		||||
        // Everything is mapped to internal server errors for now.
 | 
			
		||||
        HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR)
 | 
			
		||||
            .body(format!("An error occured: {}", self))
 | 
			
		||||
        match *self {
 | 
			
		||||
            ConverseError::ThreadClosed { id } => HttpResponse::SeeOther()
 | 
			
		||||
                .header("Location", format!("/thread/{}#edit-post", id))
 | 
			
		||||
                .finish(),
 | 
			
		||||
            _ => HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR)
 | 
			
		||||
                .body(format!("An error occured: {}", self))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -207,7 +207,10 @@ pub fn edit_form(state: State<AppState>,
 | 
			
		|||
                return Ok(post);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Err(ConverseError::PostEditForbidden { id: post.id })
 | 
			
		||||
            Err(ConverseError::PostEditForbidden {
 | 
			
		||||
                user: user_id,
 | 
			
		||||
                id: post.id,
 | 
			
		||||
            })
 | 
			
		||||
        })
 | 
			
		||||
        .and_then(move |post| {
 | 
			
		||||
            let edit_msg = EditPostPage {
 | 
			
		||||
| 
						 | 
				
			
			@ -236,7 +239,10 @@ pub fn edit_post(state: State<AppState>,
 | 
			
		|||
            if user_id != 1 && post.user_id == user_id {
 | 
			
		||||
                 Ok(())
 | 
			
		||||
            } else {
 | 
			
		||||
                Err(ConverseError::PostEditForbidden { id: post.id })
 | 
			
		||||
                Err(ConverseError::PostEditForbidden {
 | 
			
		||||
                    user: user_id,
 | 
			
		||||
                    id: post.id,
 | 
			
		||||
                })
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
        .and_then(move |_| state.db.send(update.0).from_err())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue