170 lines
5.3 KiB
Rust
170 lines
5.3 KiB
Rust
pub struct Service {
|
|
pub app: crate::app::App,
|
|
pub token: textsender_models::token::Login,
|
|
}
|
|
|
|
impl Service {
|
|
pub async fn do_the_work(&mut self) {
|
|
println!("Do some work");
|
|
println!("Checking queue");
|
|
|
|
use textsender_models::message::scheduling::ScheduledMessage;
|
|
|
|
let queue = super::queue::Queue {
|
|
app: self.app.clone(),
|
|
token: self.token.clone(),
|
|
};
|
|
let queue_item: Option<ScheduledMessage> = match queue.get_queue().await {
|
|
Ok(item) => Some(item),
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
None
|
|
}
|
|
};
|
|
|
|
if queue_item.is_none() {
|
|
println!("No queue item found");
|
|
return;
|
|
}
|
|
let queue_item = queue_item.unwrap();
|
|
|
|
println!("Queue item Id: {:?}", queue_item.id);
|
|
|
|
if !self.is_schedulable(&queue_item) {
|
|
println!("Not schedulable");
|
|
return;
|
|
}
|
|
|
|
println!("Can schedule");
|
|
|
|
let events_req = super::event::Event {
|
|
app: self.app.clone(),
|
|
token: self.token.clone(),
|
|
};
|
|
|
|
let scheduled_message_id = queue_item.id;
|
|
let events = match events_req.get(&scheduled_message_id).await {
|
|
Ok(events) => Some(events),
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
None
|
|
}
|
|
};
|
|
|
|
let contacts = super::contact::Contact {
|
|
app: self.app.clone(),
|
|
token: self.token.clone(),
|
|
};
|
|
let messages = super::message::Message {
|
|
app: self.app.clone(),
|
|
token: self.token.clone(),
|
|
};
|
|
let sch_msg = super::scheduler::ScheduledMessage {
|
|
app: self.app.clone(),
|
|
token: self.token.clone()
|
|
};
|
|
let mer_req = super::mer::MessageEventResponse {
|
|
app: self.app.clone(),
|
|
token: self.token.clone()
|
|
};
|
|
|
|
let events = events.unwrap_or_default();
|
|
for event in events {
|
|
println!("Event: {event:?}");
|
|
let contact = &match contacts.get(&event.contact_id).await {
|
|
Ok(contact) => contact,
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
continue;
|
|
}
|
|
}[0];
|
|
let message = &match messages.get(&event.message_id).await {
|
|
Ok(messages) => messages,
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
continue;
|
|
}
|
|
}[0];
|
|
let scheduled_message = match sch_msg.get(&event.scheduled_message_id).await {
|
|
Ok(sch_msg_here) => sch_msg_here,
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
continue;
|
|
}
|
|
};
|
|
|
|
println!("Contact Id: {:?}", contact.id);
|
|
println!("Message Id: {:?}", message.id);
|
|
|
|
let param = swoosh::twilio::types::Parameters {
|
|
schedule: true,
|
|
schedule_at: scheduled_message.scheduled
|
|
};
|
|
|
|
let twilio_config = &self.app.twilio_config;
|
|
|
|
|
|
match swoosh::twilio::api::send_message(&message, contact, ¶m, twilio_config).await {
|
|
Ok(resp) => {
|
|
// MER response
|
|
let result = swoosh::twilio::api::response_to_json(resp).await;
|
|
let mer = textsender_models::message::event::MessageEventResponse {
|
|
contact_id: contact.id.unwrap(),
|
|
scheduled_message_event_id: Some(event.id),
|
|
response: result,
|
|
message_id: message.id.unwrap(),
|
|
sent: scheduled_message.scheduled,
|
|
user_id: scheduled_message.user_id,
|
|
..Default::default()
|
|
};
|
|
|
|
match mer_req.record_message_event_response(&mer).await {
|
|
Ok(response) => {
|
|
println!("Response: {response:?}");
|
|
}
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
}
|
|
}
|
|
}
|
|
Err(err) => {
|
|
eprintln!("Error: {err:?}");
|
|
}
|
|
}
|
|
}
|
|
|
|
todo!(
|
|
r#"
|
|
Need to finish this
|
|
|
|
[X] - This function should fetch a token, check if the token is valid, and obtain a refresh token if
|
|
it has expired.
|
|
|
|
Then do the real work.
|
|
|
|
1. Check the queue - Done
|
|
2. If there is an item, get the data - Done
|
|
3. Evaluate if it is schedulable - Done
|
|
4. Get the events and iterate each one - Done
|
|
5. Starting with the message - Done
|
|
6. Get the contact - Done
|
|
7. Send the message
|
|
8. Record the message event response - Added, not used
|
|
9. Add to scheduler
|
|
"#
|
|
);
|
|
}
|
|
|
|
fn is_schedulable(
|
|
&self,
|
|
queue_item: &textsender_models::message::scheduling::ScheduledMessage,
|
|
) -> bool {
|
|
let now = time::OffsetDateTime::now_utc();
|
|
|
|
match queue_item.scheduled {
|
|
Some(date) => date > now,
|
|
None => false,
|
|
}
|
|
}
|
|
}
|