wsb 0.186.4098

Workspace - A tool suite for file operations, version management, and development workflow automation
Documentation
use crate::prelude::*;
use axum::{
    extract::{Path, State},
    http::StatusCode,
    Json,
};


use super::sessions::ErrorResponse;
use crate::web::state::WebState;

pub async fn list_starred(
    State(state): State<WebState>,
) -> Result<Json<serde_json::Value>, (StatusCode, Json<ErrorResponse>)> {
    let db = state.db.clone();

    let ids = tokio::task::spawn_blocking(move || {
        db.session_repo.list_starred()
    }).await.unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {}", e)))
    .map_err(|e| {
        (
            StatusCode::INTERNAL_SERVER_ERROR,
            Json(ErrorResponse {
                error: e.to_string(),
            }),
        )
    })?;
    Ok(Json(serde_json::json!({ "session_ids": ids })))
}

pub async fn star_session(
    State(state): State<WebState>,
    Path(id): Path<String>,
) -> Result<StatusCode, (StatusCode, Json<ErrorResponse>)> {
    let db = state.db.clone();
    let id_check = id.clone();

    let session = tokio::task::spawn_blocking(move || {
        db.session_repo.get_session(&id_check)
    }).await.unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {}", e)))
    .map_err(|e| {
        (
            StatusCode::INTERNAL_SERVER_ERROR,
            Json(ErrorResponse {
                error: e.to_string(),
            }),
        )
    })?;

    if session.is_none() {
        return Err((
            StatusCode::NOT_FOUND,
            Json(ErrorResponse {
                error: "session not found".to_string(),
            }),
        ));
    }

    tokio::task::spawn_blocking({
        let db = state.db.clone();
        move || db.session_repo.star_session(&id)
    }).await.unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {}", e)))
    .map_err(|e| {
        (
            StatusCode::INTERNAL_SERVER_ERROR,
            Json(ErrorResponse {
                error: e.to_string(),
            }),
        )
    })?;
    Ok(StatusCode::NO_CONTENT)
}

pub async fn unstar_session(
    State(state): State<WebState>,
    Path(id): Path<String>,
) -> Result<StatusCode, (StatusCode, Json<ErrorResponse>)> {
    tokio::task::spawn_blocking({
        let db = state.db.clone();
        move || db.session_repo.unstar_session(&id)
    }).await.unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {}", e)))
    .map_err(|e| {
        (
            StatusCode::INTERNAL_SERVER_ERROR,
            Json(ErrorResponse {
                error: e.to_string(),
            }),
        )
    })?;
    Ok(StatusCode::NO_CONTENT)
}

#[derive(Deserialize)]
pub struct BulkStarRequest {
    pub session_ids: Vec<String>,
}

pub async fn bulk_star(
    State(state): State<WebState>,
    Json(body): Json<BulkStarRequest>,
) -> Result<StatusCode, (StatusCode, Json<ErrorResponse>)> {
    let db = state.db.clone();
    let ids = body.session_ids;

    tokio::task::spawn_blocking(move || {
        db.session_repo.bulk_star(&ids)
    }).await.unwrap_or_else(|e| Err(anyhow::anyhow!("join error: {}", e)))
    .map_err(|e| {
        (
            StatusCode::INTERNAL_SERVER_ERROR,
            Json(ErrorResponse {
                error: e.to_string(),
            }),
        )
    })?;
    Ok(StatusCode::NO_CONTENT)
}