gitdataai/libs/api/project/board.rs
2026-04-14 19:02:01 +08:00

325 lines
9.6 KiB
Rust

use crate::{ApiResponse, error::ApiError};
use actix_web::{HttpResponse, Result, web};
use service::AppService;
use service::project::board::{
BoardResponse, BoardWithColumnsResponse, CardResponse, ColumnResponse, CreateBoardParams,
CreateCardParams, CreateColumnParams, MoveCardParams, UpdateBoardParams, UpdateCardParams,
UpdateColumnParams,
};
use session::Session;
use uuid::Uuid;
#[utoipa::path(
get,
path = "/api/projects/{project_name}/boards",
params(
("project_name" = String, Path, description = "Project name"),
),
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "List boards", body = ApiResponse<Vec<BoardResponse>>),
),
tag = "Project"
)]
pub async fn board_list(
service: web::Data<AppService>,
session: Session,
path: web::Path<String>,
) -> Result<HttpResponse, ApiError> {
let project_name = path.into_inner();
let boards = service.board_list(project_name, &session).await?;
Ok(ApiResponse::ok(boards).to_response())
}
#[utoipa::path(
get,
path = "/api/projects/{project_name}/boards/{board_id}",
params(
("project_name" = String, Path),
("board_id" = Uuid, Path),
),
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Get board with columns and cards", body = ApiResponse<BoardWithColumnsResponse>),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn board_get(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
) -> Result<HttpResponse, ApiError> {
let (project_name, board_id) = path.into_inner();
let board = service.board_get(project_name, board_id, &session).await?;
Ok(ApiResponse::ok(board).to_response())
}
#[utoipa::path(
post,
path = "/api/projects/{project_name}/boards",
params(
("project_name" = String, Path),
),
request_body = CreateBoardParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Create board", body = ApiResponse<BoardResponse>),
),
tag = "Project"
)]
pub async fn board_create(
service: web::Data<AppService>,
session: Session,
path: web::Path<String>,
body: web::Json<CreateBoardParams>,
) -> Result<HttpResponse, ApiError> {
let project_name = path.into_inner();
let board = service
.board_create(project_name, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(board).to_response())
}
#[utoipa::path(
patch,
path = "/api/projects/{project_name}/boards/{board_id}",
params(
("project_name" = String, Path),
("board_id" = Uuid, Path),
),
request_body = UpdateBoardParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Update board", body = ApiResponse<BoardResponse>),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn board_update(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
body: web::Json<UpdateBoardParams>,
) -> Result<HttpResponse, ApiError> {
let (project_name, board_id) = path.into_inner();
let board = service
.board_update(project_name, board_id, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(board).to_response())
}
#[utoipa::path(
delete,
path = "/api/projects/{project_name}/boards/{board_id}",
params(
("project_name" = String, Path),
("board_id" = Uuid, Path),
),
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Delete board"),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn board_delete(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
) -> Result<HttpResponse, ApiError> {
let (project_name, board_id) = path.into_inner();
service
.board_delete(project_name, board_id, &session)
.await?;
Ok(crate::api_success())
}
#[utoipa::path(
post,
path = "/api/projects/{project_name}/boards/{board_id}/columns",
params(
("project_name" = String, Path),
("board_id" = Uuid, Path),
),
request_body = CreateColumnParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Create column", body = ApiResponse<ColumnResponse>),
(status = 404, description = "Board not found"),
),
tag = "Project"
)]
pub async fn column_create(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
body: web::Json<CreateColumnParams>,
) -> Result<HttpResponse, ApiError> {
let (project_name, board_id) = path.into_inner();
let column = service
.column_create(project_name, board_id, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(column).to_response())
}
#[utoipa::path(
patch,
path = "/api/projects/{project_name}/columns/{column_id}",
params(
("project_name" = String, Path),
("column_id" = Uuid, Path),
),
request_body = UpdateColumnParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Update column", body = ApiResponse<ColumnResponse>),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn column_update(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
body: web::Json<UpdateColumnParams>,
) -> Result<HttpResponse, ApiError> {
let (project_name, column_id) = path.into_inner();
let column = service
.column_update(project_name, column_id, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(column).to_response())
}
#[utoipa::path(
delete,
path = "/api/projects/{project_name}/columns/{column_id}",
params(
("project_name" = String, Path),
("column_id" = Uuid, Path),
),
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Delete column"),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn column_delete(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
) -> Result<HttpResponse, ApiError> {
let (project_name, column_id) = path.into_inner();
service
.column_delete(project_name, column_id, &session)
.await?;
Ok(crate::api_success())
}
#[utoipa::path(
post,
path = "/api/projects/{project_name}/cards",
params(
("project_name" = String, Path),
),
request_body = CreateCardParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Create card", body = ApiResponse<CardResponse>),
),
tag = "Project"
)]
pub async fn card_create(
service: web::Data<AppService>,
session: Session,
path: web::Path<String>,
body: web::Json<CreateCardParams>,
) -> Result<HttpResponse, ApiError> {
let project_name = path.into_inner();
let card = service
.card_create(project_name, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(card).to_response())
}
#[utoipa::path(
patch,
path = "/api/projects/{project_name}/cards/{card_id}",
params(
("project_name" = String, Path),
("card_id" = Uuid, Path),
),
request_body = UpdateCardParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Update card", body = ApiResponse<CardResponse>),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn card_update(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
body: web::Json<UpdateCardParams>,
) -> Result<HttpResponse, ApiError> {
let (project_name, card_id) = path.into_inner();
let card = service
.card_update(project_name, card_id, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(card).to_response())
}
#[utoipa::path(
post,
path = "/api/projects/{project_name}/cards/{card_id}/move",
params(
("project_name" = String, Path),
("card_id" = Uuid, Path),
),
request_body = MoveCardParams,
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Move card", body = ApiResponse<CardResponse>),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn card_move(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
body: web::Json<MoveCardParams>,
) -> Result<HttpResponse, ApiError> {
let (project_name, card_id) = path.into_inner();
let card = service
.card_move(project_name, card_id, body.into_inner(), &session)
.await?;
Ok(ApiResponse::ok(card).to_response())
}
#[utoipa::path(
delete,
path = "/api/projects/{project_name}/cards/{card_id}",
params(
("project_name" = String, Path),
("card_id" = Uuid, Path),
),
responses(
(status = 401, description = "Unauthorized"),
(status = 200, description = "Delete card"),
(status = 404, description = "Not found"),
),
tag = "Project"
)]
pub async fn card_delete(
service: web::Data<AppService>,
session: Session,
path: web::Path<(String, Uuid)>,
) -> Result<HttpResponse, ApiError> {
let (project_name, card_id) = path.into_inner();
service.card_delete(project_name, card_id, &session).await?;
Ok(crate::api_success())
}