use crate::domain::entity::application_entity::ApplicationEntity;
use crate::domain::service::ApplicationDomainService;
use crate::application::dto::PageResult;
use crate::interfaces::dto::application_dto::ApplicationVO;
use genies::context::CONTEXT;
pub struct ApplicationAppService;
impl ApplicationAppService {
pub async fn list_apps(
page: u64,
size: u64,
keyword: &str,
) -> Result<PageResult<ApplicationVO>, String> {
let rb = &CONTEXT.rbatis;
let page = page.max(1);
let size = size.min(100);
let total = ApplicationEntity::count(rb, keyword)
.await
.map_err(|e| e.to_string())?;
let all = ApplicationEntity::list(rb, keyword)
.await
.map_err(|e| e.to_string())?;
let offset = ((page - 1) * size) as usize;
let list: Vec<ApplicationVO> = all.into_iter()
.skip(offset)
.take(size as usize)
.map(|e| e.into())
.collect();
Ok(PageResult {
total,
page,
size,
list,
})
}
pub async fn get_app(id: i64) -> Result<ApplicationEntity, String> {
let rb = &CONTEXT.rbatis;
ApplicationEntity::find_by_id(rb, &id)
.await
.map_err(|e| e.to_string())?
.ok_or_else(|| "应用不存在".to_string())
}
pub async fn create_app(
app_name: &str,
display_name: &str,
description: &str,
base_url: &str,
status: i8,
) -> Result<serde_json::Value, String> {
let rb = &CONTEXT.rbatis;
if app_name.is_empty() {
return Err("应用标识不能为空".to_string());
}
if base_url.is_empty() {
return Err("微服务地址不能为空".to_string());
}
if let Ok(Some(_)) = ApplicationEntity::find_by_app_name(rb, app_name).await {
return Err("应用标识已存在".to_string());
}
ApplicationDomainService::create(app_name, display_name, description, base_url, &status).await?;
let app = ApplicationEntity::find_by_app_name(rb, app_name)
.await
.ok()
.flatten();
Ok(serde_json::json!({"id": app.and_then(|a| a.id)}))
}
pub async fn update_app(
id: i64,
app_name: &str,
display_name: &str,
description: &str,
base_url: &str,
status: i8,
) -> Result<(), String> {
let _ = Self::get_app(id).await?;
ApplicationDomainService::update(id, app_name, display_name, description, base_url, &status).await
}
pub async fn delete_app(id: i64) -> Result<(), String> {
let _ = Self::get_app(id).await?;
ApplicationDomainService::delete(id).await
}
}