nature/manager_lib/
web_controller.rs

1use std::convert::TryInto;
2use std::num::ParseIntError;
3
4use actix_web::{get, HttpResponse, post, web};
5use actix_web::web::Json;
6use crate::common::*;
7
8use crate::db::{D_M, D_TE, INS_RANGE, InstanceDaoImpl, MetaDao, RawMeta, RawRelation, TaskErrDao};
9use crate::domain::*;
10use crate::domain::task::TaskCondition;
11use crate::manager_lib::meta_service::MetaService;
12use crate::manager_lib::relation_service::RelationService;
13use crate::manager_lib::task_err_service::TaskErrService;
14use crate::util::js_convert::{to_js_option_output, to_js_vec_output};
15use crate::util::web_result;
16use crate::vo::{InsCondVO, InstanceVO};
17
18/// ----------------------------------- Instance Operation ----------------------------------------
19#[post("/instance/byId")]
20async fn get_by_id(para: Json<InsCond>) -> HttpResponse {
21    debug!("/instance/byId : {:?}", &para.0);
22    let x = InstanceDaoImpl::select_by_id(para.0).await;
23    web_result(x)
24}
25
26#[post("/instance/byIdJS")]
27async fn get_by_id_js(para: Json<InsCondVO>) -> HttpResponse {
28    debug!("/instance/byIdJS : {:?}", &para.0);
29    let cond = para.0.try_into();
30    if cond.is_err() { return web_result(cond); }
31    let x = InstanceDaoImpl::select_by_id(cond.unwrap()).await;
32    let rtn: Result<Option<InstanceVO>> = to_js_option_output(x);
33    web_result(rtn)
34}
35
36#[post("/instance/downstream")]
37async fn get_downstream_instance(from: String) -> HttpResponse {
38    debug!("/instance/downstream : {:?}", &from);
39    let x = InstanceDaoImpl::select_downstream(&from).await;
40    web_result(x)
41}
42
43#[post("/instance/downstreamJS")]
44async fn get_downstream_instance_js(from: String) -> HttpResponse {
45    debug!("/instance/downstreamJS : {:?}", &from);
46    let x = InstanceDaoImpl::select_downstream(&from).await;
47    let rtn: Result<Vec<InstanceVO>> = to_js_vec_output(x);
48    web_result(rtn)
49}
50
51/// fuzzy query
52#[post("/instance/byKey")]
53async fn get_by_key_range(para: Json<InsCond>) -> HttpResponse {
54    debug!("/instance/byKey : {:?}", &para.0);
55    let x = INS_RANGE.clone().get_by_key_range(&para.0).await;
56    web_result(x)
57}
58
59/// fuzzy query
60#[post("/instance/byKeyJS")]
61async fn get_by_key_range_js(para: Json<InsCondVO>) -> HttpResponse {
62    debug!("/instance/byKeyJS : {:?}", &para.0);
63    let cond = para.0.try_into();
64    if cond.is_err() { return web_result(cond); }
65    let x = INS_RANGE.clone().get_by_key_range(&cond.unwrap()).await;
66    let rtn: Result<Vec<InstanceVO>> = to_js_vec_output(x);
67    web_result(rtn)
68}
69
70/// ----------------------------------- Meta ------------------------------------------------------
71
72/// batch query the metas, `from` is index of `id`, ascending order
73#[get("/metaIdGreatThan/{from}/{limit}")]
74async fn meta_id_great_than(path: web::Path<(i32, i32)>) -> HttpResponse {
75    let (from, limit) = path.into_inner();
76    let range = MetaService::id_great_than(from, limit).await;
77    web_result(range)
78}
79
80/// add one meta
81#[post("/meta/add")]
82async fn meta_add(path: web::Path<RawMeta>) -> HttpResponse {
83    let rtn = D_M.insert(&path.into_inner()).await;
84    web_result(rtn)
85}
86
87#[get("/meta/delete/{name}")]
88async fn meta_delete(path: web::Path<String>) -> HttpResponse {
89    let meta = Meta::from_string(&path.into_inner());
90    if meta.is_err() {
91        return web_result::<String>(Err(meta.err().unwrap()));
92    }
93    let rtn = D_M.delete(&meta.unwrap()).await;
94    web_result(rtn)
95}
96
97#[post("/meta/update")]
98async fn meta_update(raw: Json<RawMeta>) -> HttpResponse {
99    let rtn = D_M.edit(&raw).await;
100    web_result(rtn)
101}
102
103/// check meta whether used
104#[get("/metaUsed/{name}")]
105async fn meta_used(path: web::Path<String>) -> HttpResponse {
106    // TODO
107    HttpResponse::Ok().body(format!("get from: {}", path.into_inner()))
108}
109
110/// ----------------------------------- Relation ----------------------------------------------
111
112/// batch query the relations, `from` is index of `id`, ascending order
113#[get("/relationIdGreatThan/{from}/{limit}")]
114async fn relation_id_great_than(path: web::Path<(i32, i32)>) -> HttpResponse {
115    let (from, limit) = path.into_inner();
116    let range = RelationService::id_great_than(from, limit).await;
117    web_result(range)
118}
119
120#[post("/relationUpdate")]
121async fn relation_update(_relation: Json<RawRelation>) -> HttpResponse {
122    // TODO
123    HttpResponse::Ok().body(format!("get from: {}", "from"))
124}
125
126/// ----------------------------------- Failed Tasks  ----------------------------------------------
127#[post("/failed")]
128async fn failed_from(para: Json<TaskCondition>) -> HttpResponse {
129    let rtn = D_TE.get(&para.0).await;
130    web_result(rtn)
131}
132
133#[post("/failed/num")]
134async fn failed_num_from(para: Json<TaskCondition>) -> HttpResponse {
135    debug!("/failed/num : {:?}", &para.0);
136    let x = D_TE.get_num(&para.0.task_for).await;
137    web_result(x)
138}
139
140#[post("/failed/delete")]
141async fn failed_delete(task_ids: Json<Vec<String>>) -> HttpResponse {
142    let has_err = task_ids.0.iter().find(|x| x.parse::<u64>().is_err());
143    if has_err.is_some() {
144        return web_result::<Result<i32>>(Err(NatureError::VerifyError("input err".to_string())));
145    }
146    let ids = task_ids.0.join(",");
147    let rtn = D_TE.delete(&ids).await;
148    web_result(rtn)
149}
150
151#[post("/failed/deleteFor")]
152async fn failed_delete_for(task_for: String) -> HttpResponse {
153    let rtn = D_TE.delete_for(&task_for).await;
154    web_result(rtn)
155}
156
157/// reset by task id
158#[post("/failed/reset")]
159async fn failed_reset(task_ids: Json<Vec<String>>) -> HttpResponse {
160    let ids: Vec<std::result::Result<u64, ParseIntError>> = task_ids.iter().map(|x| x.parse::<u64>()).collect();
161    if ids.iter().find(|x| x.is_err()).is_some() {
162        return web_result::<Result<i32>>(Err(NatureError::VerifyError("input err".to_string())));
163    }
164    let ids: Vec<u64> = ids.into_iter().map(|x| x.unwrap()).collect();
165    let rtn = TaskErrService::move_to_task(ids).await;
166    web_result(rtn)
167}
168
169
170pub fn manager_config(cfg: &mut web::ServiceConfig) {
171    cfg.service(meta_id_great_than)
172        .service(meta_add)
173        .service(meta_used)
174        .service(meta_delete)
175        .service(meta_update)
176        .service(get_by_id)
177        .service(get_by_id_js)
178        .service(get_by_key_range)
179        .service(get_by_key_range_js)
180        .service(get_downstream_instance)
181        .service(get_downstream_instance_js)
182        .service(relation_id_great_than)
183        .service(relation_update)
184        .service(failed_from)
185        .service(failed_num_from)
186        .service(failed_delete)
187        .service(failed_delete_for)
188        .service(failed_reset)
189    ;
190}