- sheet api
- wip resolver

Signed-off-by: Pakin <pakin.t@forth.co.th>
This commit is contained in:
Pakin 2026-04-21 15:52:20 +07:00
parent e9803ba8f8
commit 4f768b109a

View file

@ -58,6 +58,7 @@ pub struct DevConfig {
api_domain: String, api_domain: String,
api_recipe_service: String, api_recipe_service: String,
api_redis_url: String, api_redis_url: String,
api_resolver: String,
} }
impl DevConfig { impl DevConfig {
@ -66,12 +67,14 @@ impl DevConfig {
domain: String, domain: String,
rp_service: String, rp_service: String,
api_redis_url: String, api_redis_url: String,
api_resolver: String,
) -> DevConfig { ) -> DevConfig {
DevConfig { DevConfig {
api_key: key, api_key: key,
api_domain: domain, api_domain: domain,
api_recipe_service: rp_service, api_recipe_service: rp_service,
api_redis_url, api_redis_url,
api_resolver,
} }
} }
@ -86,6 +89,10 @@ impl DevConfig {
pub fn get_api_header(&self) -> (String, String) { pub fn get_api_header(&self) -> (String, String) {
("X-API-Key".to_string(), self.api_key.clone()) ("X-API-Key".to_string(), self.api_key.clone())
} }
pub fn get_yuki_resolver(&self) -> String {
format!("{}/resolve", self.api_resolver)
}
} }
// async fn test_send(dev_cfg: DevConfig) -> Result<(), Box<dyn std::error::Error>> { // async fn test_send(dev_cfg: DevConfig) -> Result<(), Box<dyn std::error::Error>> {
@ -258,7 +265,7 @@ async fn fetch_content_from_redis_byte(redis: redis::Client, key: &str) -> Resul
} }
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize, Clone)]
struct WebsocketMessageRequest { struct WebsocketMessageRequest {
#[serde(rename = "type")] #[serde(rename = "type")]
type_w: String, type_w: String,
@ -289,6 +296,23 @@ struct CommandRequestPayload {
values: serde_json::Value, values: serde_json::Value,
} }
#[derive(Debug, Serialize, Deserialize, Clone)]
struct LogReportPayload {
// expect either `email` or `unknown`
user: String,
action: String,
// expect either country name or `unknown dep`
country: String,
values: serde_json::Value,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
struct SaveRecipePayload {
user: String,
country: String,
values: serde_json::Value,
}
fn convert_ack_command(cmd_req: &serde_json::Value) -> Option<CommandRequestPayload> { fn convert_ack_command(cmd_req: &serde_json::Value) -> Option<CommandRequestPayload> {
match serde_json::from_value(cmd_req.clone()) { match serde_json::from_value(cmd_req.clone()) {
Ok(req) => Some(req), Ok(req) => Some(req),
@ -323,6 +347,7 @@ async fn read(
match msg { match msg {
Message::Text(t) => { Message::Text(t) => {
let req: WebsocketMessageRequest = serde_json::from_str(t.as_str())?; let req: WebsocketMessageRequest = serde_json::from_str(t.as_str())?;
let req_clone = req.clone();
match req.type_w.as_str() { match req.type_w.as_str() {
"recipe" if req.payload.is_some() => { "recipe" if req.payload.is_some() => {
// guard expect value // guard expect value
@ -532,6 +557,76 @@ async fn read(
"heartbeat" => { "heartbeat" => {
*last_seen.lock().await = Instant::now(); *last_seen.lock().await = Instant::now();
} }
"sheet" if let Some(sheet_req) = req.payload => {
// CommandRequestPayload struct-like
let payload_sheet_request: CommandRequestPayload =
match serde_json::from_value(sheet_req) {
Ok(sreq) => sreq,
Err(e) => {
error!("error deserialize body sheet request: {e:?} ---> Skip");
continue;
}
};
info!(
"get sheet request: {}, {:?}",
payload_sheet_request.srv_name, payload_sheet_request
);
let parameters = payload_sheet_request
.values
.get("param")
.unwrap_or_default();
let ch_target = if let Some(pm) = parameters.as_str() {
match pm {
"get_all_catalogs" => "catalogs",
"get_catalog" | "enter" => "enter",
"heartbeat" => "heartbeat",
_ => "junk",
}
} else {
"junk"
};
let channel = format!("{}/{}", payload_sheet_request.srv_name, ch_target);
info!("publishing to {channel}");
let mut rcl = redis.clone();
let pub_res = rcl.publish(
channel,
serde_json::to_string(&req_clone.clone()).unwrap_or("{}".to_string()),
);
if let Err(e) = pub_res {
error!("error on publish result cmd: {e:?}");
}
}
"log_report" if let Some(log_payload) = req.payload => {
let log_report_payload: LogReportPayload =
match serde_json::from_value(log_payload) {
Ok(lreq) => lreq,
Err(e) => {
error!("error deserialize body log request: {e:?} ---> Skip");
continue;
}
};
// generate timestamp
//
let now = Instant::now();
}
"save_recipe" if let Some(save_recipe_payload) = req.payload => {
let save_recipe_payload: SaveRecipePayload =
match serde_json::from_value(save_recipe_payload) {
Ok(lreq) => lreq,
Err(e) => {
error!("error deserialize body log request: {e:?} ---> Skip");
continue;
}
};
}
_ => { _ => {
// not implemented // not implemented
} }
@ -756,7 +851,10 @@ impl AppState {
if pending_command.len() < 10 { if pending_command.len() < 10 {
pending_command.push_back(fail_payload) pending_command.push_back(fail_payload)
} else { } else {
let user_name = fail_payload.user_info.get("name").unwrap_or_default(); let user_name = fail_payload
.user_info
.get("displayName")
.unwrap_or_default();
let _ = tx_new.send(serde_json::json!({ let _ = tx_new.send(serde_json::json!({
"type": "notify", "type": "notify",
@ -840,11 +938,11 @@ impl AppState {
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Hello, world!");
//println!("{}", include_str!("main.rs"));
dotenv::dotenv().ok(); dotenv::dotenv().ok();
env_logger::init(); env_logger::builder()
.filter_level(log::LevelFilter::Info)
.init();
// send req to repo service // send req to repo service
let server_port = env::var("PORT").unwrap_or("36579".to_string()); let server_port = env::var("PORT").unwrap_or("36579".to_string());
@ -856,11 +954,14 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let api_redis = env::var("DEV_API_REDIS").unwrap_or("0.0.0.0".to_string()); let api_redis = env::var("DEV_API_REDIS").unwrap_or("0.0.0.0".to_string());
let api_redis_port = env::var("DEV_API_REDIS_PORT").unwrap_or("6379".to_string()); let api_redis_port = env::var("DEV_API_REDIS_PORT").unwrap_or("6379".to_string());
let api_resolver = env::var("RESOLVER_SERVICE_URL").expect("no available resolver");
let dev_cfg = DevConfig::new( let dev_cfg = DevConfig::new(
api_key, api_key,
api_domain, api_domain,
api_recipe_service, api_recipe_service,
format!("redis://{api_redis}:{api_redis_port}"), format!("redis://{api_redis}:{api_redis_port}"),
api_resolver,
); );
// test_send(dev_cfg).await?; // test_send(dev_cfg).await?;