use super::accounts_core::{to_account_response, AccountResponse};
use crate::modules::system::migration;
use crate::proxy::admin::ErrorResponse;
use crate::proxy::state::AdminState;
use axum::{
extract::{Json, State},
http::StatusCode,
response::IntoResponse,
};
use serde::Deserialize;
pub(crate) async fn admin_import_v1_accounts(
State(state): State<AdminState>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
let accounts = migration::import_from_v1().await.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})?;
let _ = state.core.token_manager.load_accounts().await;
let current_id = state.core.account_service.get_current_id().map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})?;
let responses: Vec<AccountResponse> = accounts
.iter()
.map(|a| to_account_response(a, ¤t_id))
.collect();
Ok(Json(responses))
}
#[derive(Deserialize)]
pub(crate) struct CustomDbRequest {
path: String,
}
pub(crate) async fn admin_import_custom_db(
State(state): State<AdminState>,
Json(payload): Json<CustomDbRequest>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
if payload.path.contains("..") {
return Err((
StatusCode::BAD_REQUEST,
Json(ErrorResponse {
error: "Illegal path: Directory traversal not allowed".to_string(),
}),
));
}
let account = migration::import_from_custom_db_path(payload.path)
.await
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})?;
let _ = state.core.token_manager.load_accounts().await;
let current_id = state.core.account_service.get_current_id().map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})?;
Ok(Json(to_account_response(&account, ¤t_id)))
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CliSyncStatusRequest {
app_type: crate::proxy::cli_sync::CliApp,
proxy_url: String,
}
pub(crate) async fn admin_get_cli_sync_status(
Json(payload): Json<CliSyncStatusRequest>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
crate::proxy::cli_sync::get_cli_sync_status(payload.app_type, payload.proxy_url)
.await
.map(Json)
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CliSyncRequest {
app_type: crate::proxy::cli_sync::CliApp,
proxy_url: String,
api_key: String,
}
pub(crate) async fn admin_execute_cli_sync(
Json(payload): Json<CliSyncRequest>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
crate::proxy::cli_sync::execute_cli_sync(payload.app_type, payload.proxy_url, payload.api_key)
.await
.map(|_| StatusCode::OK)
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CliRestoreRequest {
app_type: crate::proxy::cli_sync::CliApp,
}
pub(crate) async fn admin_execute_cli_restore(
Json(payload): Json<CliRestoreRequest>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
crate::proxy::cli_sync::execute_cli_restore(payload.app_type)
.await
.map(|_| StatusCode::OK)
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})
}
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct CliConfigContentRequest {
app_type: crate::proxy::cli_sync::CliApp,
file_name: Option<String>,
}
pub(crate) async fn admin_get_cli_config_content(
Json(payload): Json<CliConfigContentRequest>,
) -> Result<impl IntoResponse, (StatusCode, Json<ErrorResponse>)> {
crate::proxy::cli_sync::get_cli_config_content(payload.app_type, payload.file_name)
.await
.map(Json)
.map_err(|e| {
(
StatusCode::INTERNAL_SERVER_ERROR,
Json(ErrorResponse { error: e }),
)
})
}