use actix_web::{HttpResponse, web}; use serde::Deserialize; use utoipa::IntoParams; use uuid::Uuid; use crate::api::response::{ApiErrorResponse, ApiResponse}; use crate::error::AppError; use crate::models::prs::PrReviewRequest; use crate::service::AppService; use crate::session::Session; #[derive(Debug, Deserialize, IntoParams)] pub struct PathParams { pub workspace_name: String, pub repo_name: String, pub number: i64, } #[derive(Debug, Deserialize, IntoParams)] pub struct ReviewerPathParams { pub workspace_name: String, pub repo_name: String, pub number: i64, pub user_id: Uuid, } #[derive(Debug, Deserialize, utoipa::ToSchema)] pub struct RequestReviewersBody { pub reviewer_ids: Vec, } #[utoipa::path( get, path = "/api/v1/workspaces/{workspace_name}/repos/{repo_name}/prs/{number}/requested_reviewers", tag = "PullRequests", operation_id = "prListRequestedReviewers", params(PathParams), responses( (status = 200, description = "List of requested reviewers", body = ApiResponse>), (status = 401, description = "Unauthorized", body = ApiErrorResponse), ), security(("session_cookie" = [])) )] pub async fn list_requested_reviewers( service: web::Data, session: Session, path: web::Path, ) -> Result { let result = service .pr .pr_requested_reviewers(&session, &path.workspace_name, &path.repo_name, path.number) .await?; Ok(HttpResponse::Ok().json(ApiResponse::new(result))) } #[utoipa::path( post, path = "/api/v1/workspaces/{workspace_name}/repos/{repo_name}/prs/{number}/requested_reviewers", tag = "PullRequests", operation_id = "prRequestReviewers", params(PathParams), request_body(content = RequestReviewersBody), responses( (status = 201, description = "Reviewers requested", body = ApiResponse>), (status = 401, description = "Unauthorized", body = ApiErrorResponse), ), security(("session_cookie" = [])) )] pub async fn request_reviewers( service: web::Data, session: Session, path: web::Path, body: web::Json, ) -> Result { let result = service .pr .pr_request_reviewers( &session, &path.workspace_name, &path.repo_name, path.number, body.reviewer_ids.clone(), ) .await?; Ok(HttpResponse::Created().json(ApiResponse::new(result))) } #[utoipa::path( delete, path = "/api/v1/workspaces/{workspace_name}/repos/{repo_name}/prs/{number}/requested_reviewers/{user_id}", tag = "PullRequests", operation_id = "prRemoveRequestedReviewer", params(ReviewerPathParams), responses( (status = 200, description = "Reviewer removed", body = ApiResponse), (status = 401, description = "Unauthorized", body = ApiErrorResponse), ), security(("session_cookie" = [])) )] pub async fn remove_requested_reviewer( service: web::Data, session: Session, path: web::Path, ) -> Result { service .pr .pr_remove_requested_reviewer( &session, &path.workspace_name, &path.repo_name, path.number, path.user_id, ) .await?; Ok(HttpResponse::Ok().json(ApiResponse::new("reviewer removed".to_string()))) }