2026-01-26 14:18:40 -05:00
|
|
|
use crate::{
|
2026-02-16 09:53:04 -05:00
|
|
|
action::{Action, CalcValue, Calculation, Delete, FieldType, Operand, Query, Update},
|
2026-01-26 14:18:40 -05:00
|
|
|
document::{
|
2026-02-04 08:49:03 -05:00
|
|
|
clock::Clock,
|
2026-01-26 14:18:40 -05:00
|
|
|
create::IndexType,
|
|
|
|
|
definition::{DocDef, DocFuncType},
|
2026-02-03 08:56:42 -05:00
|
|
|
},
|
2026-02-16 09:53:04 -05:00
|
|
|
message::wrapper::Message,
|
2026-01-26 14:18:40 -05:00
|
|
|
name::{Name, NameType},
|
2026-01-30 13:58:55 -05:00
|
|
|
queue::{
|
|
|
|
|
data_director::{Include, Path, RegMsg, Register},
|
|
|
|
|
router::Queue,
|
|
|
|
|
},
|
2026-01-26 14:18:40 -05:00
|
|
|
};
|
|
|
|
|
use std::{sync::mpsc::channel, time::Duration};
|
|
|
|
|
|
|
|
|
|
pub struct Session;
|
|
|
|
|
|
|
|
|
|
impl Session {
|
2026-02-09 19:28:22 -05:00
|
|
|
pub fn doc_names() -> Vec<Name> {
|
2026-01-26 14:18:40 -05:00
|
|
|
let mut names = Vec::new();
|
|
|
|
|
names.push(Name::english("session"));
|
|
|
|
|
names
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn start(mut queue: Queue) {
|
|
|
|
|
let mut docdef = DocDef::with_names(Self::doc_names());
|
|
|
|
|
|
|
|
|
|
let mut calc = Calculation::new(Operand::Add);
|
|
|
|
|
calc.add_value(FieldType::DateTime).unwrap();
|
|
|
|
|
calc.add_value(Duration::from_hours(1)).unwrap();
|
|
|
|
|
|
|
|
|
|
let name_id = Name::english("id");
|
|
|
|
|
docdef.add_field(name_id.clone(), FieldType::Uuid);
|
|
|
|
|
docdef.set_default(&name_id, FieldType::Uuid).unwrap();
|
|
|
|
|
docdef.add_index(&name_id, IndexType::Unique).unwrap();
|
|
|
|
|
|
|
|
|
|
let name_expire = Name::english("expire");
|
|
|
|
|
docdef.add_field(name_expire.clone(), FieldType::DateTime);
|
|
|
|
|
docdef.set_default(&name_expire, calc.clone()).unwrap();
|
2026-02-04 08:49:03 -05:00
|
|
|
docdef.add_index(&name_expire, IndexType::Index).unwrap();
|
2026-01-26 14:18:40 -05:00
|
|
|
|
2026-02-16 09:53:04 -05:00
|
|
|
let mut update = Update::new(Session::doc_names()[0].clone());
|
2026-01-26 14:18:40 -05:00
|
|
|
update
|
|
|
|
|
.get_values_mut()
|
|
|
|
|
.add_field(name_expire.clone(), calc.clone());
|
|
|
|
|
let path = Path::new(
|
|
|
|
|
Include::All,
|
|
|
|
|
Include::Just(Session::doc_names()[0].clone().into()),
|
|
|
|
|
Include::Just(Action::OnQuery),
|
|
|
|
|
);
|
|
|
|
|
let query_action = DocFuncType::ExistingQuery(update.into());
|
|
|
|
|
docdef.add_route(path, query_action);
|
|
|
|
|
|
2026-02-16 08:28:59 -05:00
|
|
|
let mut delete = Delete::new(Session::doc_names()[0].clone());
|
|
|
|
|
let delete_qry = delete.get_query_mut();
|
2026-01-26 14:18:40 -05:00
|
|
|
let mut delete_calc = Calculation::new(Operand::LessThan);
|
|
|
|
|
delete_calc.add_value(FieldType::DateTime).unwrap();
|
|
|
|
|
delete_calc
|
|
|
|
|
.add_value(CalcValue::Existing(FieldType::DateTime))
|
|
|
|
|
.unwrap();
|
|
|
|
|
delete_qry.add(name_expire.clone(), delete_calc);
|
|
|
|
|
let delete_func = DocFuncType::Trigger(delete.into());
|
2026-02-04 08:49:03 -05:00
|
|
|
docdef.add_route(Clock::get_path(), delete_func);
|
2026-01-26 14:18:40 -05:00
|
|
|
|
|
|
|
|
let (tx, rx) = channel();
|
|
|
|
|
let sender_id = queue.add_sender(tx);
|
2026-02-18 10:09:55 -05:00
|
|
|
let msg = Message::new(docdef);
|
2026-01-26 14:18:40 -05:00
|
|
|
let msg_id = msg.get_message_id().clone();
|
|
|
|
|
let path = Path::new(
|
|
|
|
|
Include::Just(msg_id),
|
|
|
|
|
Include::All,
|
|
|
|
|
Include::Just(Action::Reply),
|
|
|
|
|
);
|
|
|
|
|
let reg_msg = Register::new(sender_id.clone(), RegMsg::AddRoute(path));
|
2026-01-30 14:55:42 -05:00
|
|
|
queue.send(msg.response(reg_msg));
|
2026-01-26 14:18:40 -05:00
|
|
|
rx.recv().unwrap();
|
2026-01-30 14:55:42 -05:00
|
|
|
queue.send(msg);
|
2026-01-26 14:18:40 -05:00
|
|
|
rx.recv().unwrap();
|
|
|
|
|
queue.remove_sender(&sender_id);
|
|
|
|
|
}
|
|
|
|
|
}
|