use beteran_common_rust as bcr; use beteran_protobuf_rust as bpr; use prost::Message; /// pub struct Service { connection_broker: nats::asynk::Connection, queue_broker: String, } impl std::fmt::Debug for Service { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { f.debug_struct("beteran-backend-server-edge::member_level::service::Service") .finish() } } impl Service { /// pub fn new(connection_broker: nats::asynk::Connection, queue_broker: String) -> Service { Service { connection_broker, queue_broker, } } pub async fn subscribe(&self) -> std::result::Result<(), std::boxed::Box> { futures::try_join!( self.create_member_level(), self.list_member_levels(), self.get_member_level(), self.update_member_level(), self.delete_member_level(), ) .map(|_| ()) } fn get_client_in_header( &self, message: &nats::asynk::Message, ) -> Result { match &message.headers { Some(headers) => { let client = match headers.get(bpr::c2se::core::network::HEADER_CLIENT) { Some(c) => { let msg = base64::decode(c).map_err(|e| { bcr::error::rpc::Error::Parse(bcr::error::rpc::Parse { message: format!("invalid header: {}", e), }) })?; bpr::models::core::network::Client::decode(msg.as_slice()).map_err(|e| { bcr::error::rpc::Error::Parse(bcr::error::rpc::Parse { message: format!("invalid header: {}", e), }) })? } None => { return Err(bcr::error::rpc::Error::Parse(bcr::error::rpc::Parse { message: "invalid client information".to_string(), })); } }; Ok(client) } None => Err(bcr::error::rpc::Error::Parse(bcr::error::rpc::Parse { message: "invalid header".to_string(), })), } } async fn create_member_level(&self) -> Result<(), Box> { let s = self .connection_broker .queue_subscribe( bpr::c2se::backend::member_level::SUBJECT_CREATE_MEMBER_LEVEL, self.queue_broker.as_str(), ) .await?; while let Some(message) = s.next().await { if let Err(e) = async { let client = self.get_client_in_header(&message)?; let req = bpr::c2se::member_level::CreateMemberLevelRequest::decode(message.data.as_slice()) .map_err(|e| { bcr::error::rpc::Error::InvalidRequest(bcr::error::rpc::InvalidRequest { message: format!("invalid request: {}", e), }) })?; let ss_create_member_level_req = bpr::ss::member_level::CreateMemberLevelRequest { client: Some(client), request: Some( bpr::ss::member_level::create_member_level_request::Request { name: req.name, sort_order: req.sort_order, show: req.show, }, ), }; let ss_create_member_level_res_msg = self .connection_broker .request( bpr::ss::member_level::SUBJECT_CREATE_MEMBER_LEVEL, ss_create_member_level_req.encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; let ss_create_member_level_res = bpr::ss::member_level::CreateMemberLevelResponse::decode( ss_create_member_level_res_msg.data.as_slice(), ) .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; if let Some(e) = ss_create_member_level_res.error { return Err(bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, })); } if let Some(r) = ss_create_member_level_res.result { message .respond( bpr::c2se::member_level::CreateMemberLevelResponse { error: None, result: Some( bpr::c2se::member_level::create_member_level_response::Result { member_level: r.member_level, }, ), } .encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; } Ok::<(), bcr::error::rpc::Error>(()) } .await { message .respond( bpr::c2se::member_level::CreateMemberLevelResponse { error: Some(bpr::protobuf::rpc::Error::from(e)), result: None, } .encode_to_vec(), ) .await?; } } Ok(()) } async fn list_member_levels(&self) -> Result<(), Box> { let s = self .connection_broker .queue_subscribe( bpr::c2se::backend::member_level::SUBJECT_LIST_MEMBER_LEVELS, self.queue_broker.as_str(), ) .await?; while let Some(message) = s.next().await { if let Err(e) = async { let client = self.get_client_in_header(&message)?; let req = bpr::c2se::member_level::ListMemberLevelsRequest::decode(message.data.as_slice()) .map_err(|e| { bcr::error::rpc::Error::InvalidRequest(bcr::error::rpc::InvalidRequest { message: format!("invalid request: {}", e), }) })?; let ss_list_member_levels_req = bpr::ss::member_level::ListMemberLevelsRequest { client: Some(client), request: Some(bpr::ss::member_level::list_member_levels_request::Request { pagination: req.pagination, sorts: req.sorts, search: match req.search { Some(s) => Some( bpr::ss::member_level::list_member_levels_request::request::Search { name_like: s.name_like, show: s.show, }, ), None => None, }, }), }; let ss_list_member_levels_res_msg = self .connection_broker .request( bpr::ss::member_level::SUBJECT_LIST_MEMBER_LEVELS, ss_list_member_levels_req.encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; let ss_list_member_levels_res = bpr::ss::member_level::ListMemberLevelsResponse::decode( ss_list_member_levels_res_msg.data.as_slice(), ) .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; if let Some(e) = ss_list_member_levels_res.error { return Err(bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, })); } if let Some(r) = ss_list_member_levels_res.result { message .respond( bpr::c2se::member_level::ListMemberLevelsResponse { error: None, result: Some( bpr::c2se::member_level::list_member_levels_response::Result { total_count: r.total_count, member_levels: r.member_levels, }, ), } .encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; } Ok::<(), bcr::error::rpc::Error>(()) } .await { message .respond( bpr::c2se::member_level::ListMemberLevelsResponse { error: Some(bpr::protobuf::rpc::Error::from(e)), result: None, } .encode_to_vec(), ) .await?; } } Ok(()) } async fn get_member_level(&self) -> Result<(), Box> { let s = self .connection_broker .queue_subscribe( bpr::c2se::backend::member_level::SUBJECT_GET_MEMBER_LEVEL, self.queue_broker.as_str(), ) .await?; while let Some(message) = s.next().await { if let Err(e) = async { let client = self.get_client_in_header(&message)?; let req = bpr::c2se::member_level::GetMemberLevelRequest::decode(message.data.as_slice()) .map_err(|e| { bcr::error::rpc::Error::InvalidRequest(bcr::error::rpc::InvalidRequest { message: format!("invalid request: {}", e), }) })?; let ss_get_member_level_req = bpr::ss::member_level::GetMemberLevelRequest { client: Some(client), request: Some(bpr::ss::member_level::get_member_level_request::Request { id: req.id }), }; let ss_get_member_level_res_msg = self .connection_broker .request( bpr::ss::member_level::SUBJECT_UPDATE_MEMBER_LEVEL, ss_get_member_level_req.encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; let ss_get_member_level_res = bpr::ss::member_level::GetMemberLevelResponse::decode( ss_get_member_level_res_msg.data.as_slice(), ) .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; if let Some(e) = ss_get_member_level_res.error { return Err(bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, })); } if let Some(r) = ss_get_member_level_res.result { message .respond( bpr::c2se::member_level::GetMemberLevelResponse { error: None, result: Some(bpr::c2se::member_level::get_member_level_response::Result { member_level: r.member_level, }), } .encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; } Ok::<(), bcr::error::rpc::Error>(()) } .await { message .respond( bpr::c2se::member_level::GetMemberLevelResponse { error: Some(bpr::protobuf::rpc::Error::from(e)), result: None, } .encode_to_vec(), ) .await?; } } Ok(()) } async fn update_member_level(&self) -> Result<(), Box> { let s = self .connection_broker .queue_subscribe( bpr::c2se::backend::member_level::SUBJECT_UPDATE_MEMBER_LEVEL, self.queue_broker.as_str(), ) .await?; while let Some(message) = s.next().await { if let Err(e) = async { let client = self.get_client_in_header(&message)?; let req = bpr::c2se::member_level::UpdateMemberLevelRequest::decode(message.data.as_slice()) .map_err(|e| { bcr::error::rpc::Error::InvalidRequest(bcr::error::rpc::InvalidRequest { message: format!("invalid request: {}", e), }) })?; let ss_update_member_level_req = bpr::ss::member_level::UpdateMemberLevelRequest { client: Some(client), request: Some( bpr::ss::member_level::update_member_level_request::Request { id: req.id, name: req.name, sort_order: req.sort_order, show: req.show, }, ), }; let ss_update_member_level_res_msg = self .connection_broker .request( bpr::ss::member_level::SUBJECT_UPDATE_MEMBER_LEVEL, ss_update_member_level_req.encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; let ss_update_member_level_res = bpr::ss::member_level::UpdateMemberLevelResponse::decode( ss_update_member_level_res_msg.data.as_slice(), ) .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; if let Some(e) = ss_update_member_level_res.error { return Err(bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, })); } if let Some(r) = ss_update_member_level_res.result { message .respond( bpr::c2se::member_level::UpdateMemberLevelResponse { error: None, result: Some( bpr::c2se::member_level::update_member_level_response::Result { member_level: r.member_level, }, ), } .encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; } Ok::<(), bcr::error::rpc::Error>(()) } .await { message .respond( bpr::c2se::member_level::UpdateMemberLevelResponse { error: Some(bpr::protobuf::rpc::Error::from(e)), result: None, } .encode_to_vec(), ) .await?; } } Ok(()) } async fn delete_member_level(&self) -> Result<(), Box> { let s = self .connection_broker .queue_subscribe( bpr::c2se::backend::member_level::SUBJECT_DELETE_MEMBER_LEVEL, self.queue_broker.as_str(), ) .await?; while let Some(message) = s.next().await { if let Err(e) = async { let client = self.get_client_in_header(&message)?; let req = bpr::c2se::member_level::DeleteMemberLevelRequest::decode(message.data.as_slice()) .map_err(|e| { bcr::error::rpc::Error::InvalidRequest(bcr::error::rpc::InvalidRequest { message: format!("invalid request: {}", e), }) })?; let ss_delete_member_level_req = bpr::ss::member_level::DeleteMemberLevelRequest { client: Some(client), request: Some(bpr::ss::member_level::delete_member_level_request::Request { id: req.id }), }; let ss_delete_member_level_res_msg = self .connection_broker .request( bpr::ss::member_level::SUBJECT_DELETE_MEMBER_LEVEL, ss_delete_member_level_req.encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; let ss_delete_member_level_res = bpr::ss::member_level::DeleteMemberLevelResponse::decode( ss_delete_member_level_res_msg.data.as_slice(), ) .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; if let Some(e) = ss_delete_member_level_res.error { return Err(bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, })); } if let Some(r) = ss_delete_member_level_res.result { message .respond( bpr::c2se::member_level::DeleteMemberLevelResponse { error: None, result: Some(bpr::c2se::member_level::delete_member_level_response::Result {}), } .encode_to_vec(), ) .await .map_err(|e| { bcr::error::rpc::Error::Server(bcr::error::rpc::Server { code: bpr::protobuf::rpc::Error::SERVER_00, message: format!("server {}", e), data: None, }) })?; } Ok::<(), bcr::error::rpc::Error>(()) } .await { message .respond( bpr::c2se::member_level::DeleteMemberLevelResponse { error: Some(bpr::protobuf::rpc::Error::from(e)), result: None, } .encode_to_vec(), ) .await?; } } Ok(()) } }