Replaced session id with SessionEntry.
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled

This commit is contained in:
2026-05-03 10:12:36 -04:00
parent 332200f2c6
commit 7004ce4b81
2 changed files with 77 additions and 45 deletions

View File

@@ -1,7 +1,7 @@
use crate::{ use crate::{
action::{Field, MsgAction}, action::{Field, MsgAction},
name::NameType, name::NameType,
queue::data_director::{Include, Path, Route}, queue::data_director::{Include, Path, Route, SessionEntry},
}; };
use uuid::Uuid; use uuid::Uuid;
@@ -41,7 +41,7 @@ pub struct Message {
msg_id: MessageID, msg_id: MessageID,
action: MsgAction, action: MsgAction,
route: Route, route: Route,
session: Field, session: SessionEntry,
} }
impl Message { impl Message {
@@ -58,10 +58,15 @@ impl Message {
output output
} }
pub fn session_id(&self) -> &Field {
self.session.id()
}
pub fn set_session<F>(&self, session: F) -> Self pub fn set_session<F>(&self, session: F) -> Self
where where
F: Into<Field>, F: Into<Field>,
{ {
/*
let sess_id = match session.into() { let sess_id = match session.into() {
Field::Uuid(data) => Field::Uuid(data.clone()), Field::Uuid(data) => Field::Uuid(data.clone()),
Field::StaticString(data) => match Uuid::try_from(data) { Field::StaticString(data) => match Uuid::try_from(data) {
@@ -70,8 +75,10 @@ impl Message {
}, },
_ => Field::None, _ => Field::None,
}; };
*/
let mut output = self.clone(); let mut output = self.clone();
output.session = sess_id; // output.session = sess_id;
output.session = SessionEntry::new(session);
output output
} }
@@ -115,7 +122,7 @@ impl Default for Message {
msg_id: MessageID::new(), msg_id: MessageID::new(),
action: MsgAction::None, action: MsgAction::None,
route: Route::default(), route: Route::default(),
session: Field::None, session: SessionEntry::new(Field::None),
} }
} }
} }
@@ -141,7 +148,7 @@ mod messages {
MsgAction::None => {} MsgAction::None => {}
_ => panic!("should have been no action"), _ => panic!("should have been no action"),
} }
assert_eq!(msg.session, Field::None); assert_eq!(msg.session_id(), &Field::None);
} }
#[test] #[test]
@@ -150,11 +157,11 @@ mod messages {
let qry = Query::new(doc_name.clone()); let qry = Query::new(doc_name.clone());
let msg = Message::new(qry); let msg = Message::new(qry);
let expected: NameType = doc_name.into(); let expected: NameType = doc_name.into();
match msg.action { match &msg.action {
MsgAction::Query(data) => assert_eq!(data.doc_name(), &expected), MsgAction::Query(data) => assert_eq!(data.doc_name(), &expected),
_ => unreachable!("should have been a query"), _ => unreachable!("should have been a query"),
} }
match msg.session { match msg.session_id() {
Field::None => {} Field::None => {}
_ => unreachable!("should have been none"), _ => unreachable!("should have been none"),
} }
@@ -175,25 +182,16 @@ mod messages {
let qry = Query::new(doc_name.clone()); let qry = Query::new(doc_name.clone());
let sess_id: Field = Uuid::new_v4().into(); let sess_id: Field = Uuid::new_v4().into();
let msg = Message::new(qry).set_session(sess_id.clone()); let msg = Message::new(qry).set_session(sess_id.clone());
assert_eq!(msg.session, sess_id); assert_eq!(msg.session_id(), &sess_id);
} }
#[test] #[test]
fn can_session_be_set_by_string() { fn can_session_be_set_by_string() {
let doc_name = Name::english("string"); let doc_name = Name::english("string");
let qry = Query::new(doc_name.clone()); let qry = Query::new(doc_name.clone());
let sess_id = Uuid::new_v4(); let sess_id: Field = Uuid::new_v4().to_string().into();
let msg = Message::new(qry).set_session(sess_id.to_string()); let msg = Message::new(qry).set_session(sess_id.clone());
assert_eq!(msg.session, sess_id.into()); assert_eq!(msg.session_id(), &sess_id);
}
#[test]
fn does_garbage_return_none() {
let doc_name = Name::english("garbage");
let qry = Query::new(doc_name.clone());
let sess_id = "not a uuid";
let msg = Message::new(qry).set_session(sess_id);
assert_eq!(msg.session, Field::None);
} }
#[test] #[test]
@@ -202,16 +200,7 @@ mod messages {
let qry = Query::new(doc_name.clone()); let qry = Query::new(doc_name.clone());
let sess_id = Uuid::new_v4(); let sess_id = Uuid::new_v4();
let msg = Message::new(qry).set_session(sess_id.clone()); let msg = Message::new(qry).set_session(sess_id.clone());
assert_eq!(msg.session, sess_id.into()); assert_eq!(msg.session_id(), &sess_id.into());
}
#[test]
fn does_wrong_field_type_return_none() {
let doc_name = Name::english("uuid");
let qry = Query::new(doc_name.clone());
let sess_id = FieldType::DateTime.get_default();
let msg = Message::new(qry).set_session(sess_id.clone());
assert_eq!(msg.session, Field::None);
} }
#[test] #[test]

View File

@@ -1,5 +1,4 @@
use super::SenderID; use super::SenderID;
use chrono::{DateTime, Utc};
use crate::{ use crate::{
action::{Action, Field, MsgAction}, action::{Action, Field, MsgAction},
message::{Message, MessageAction, MessageID}, message::{Message, MessageAction, MessageID},
@@ -7,6 +6,7 @@ use crate::{
name::{Name, NameID, NameType, Names}, name::{Name, NameID, NameType, Names},
queue::router::Queue, queue::router::Queue,
}; };
use chrono::{DateTime, Utc};
use std::{ use std::{
collections::{HashMap, HashSet}, collections::{HashMap, HashSet},
sync::mpsc::Receiver, sync::mpsc::Receiver,
@@ -487,7 +487,7 @@ mod route_storeage {
} }
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
struct SessionEntry { pub struct SessionEntry {
id: Field, id: Field,
expire_time: DateTime<Utc>, expire_time: DateTime<Utc>,
} }
@@ -495,14 +495,17 @@ struct SessionEntry {
impl SessionEntry { impl SessionEntry {
const EXPIRE_IN: Duration = Duration::from_hours(1); const EXPIRE_IN: Duration = Duration::from_hours(1);
fn new(id: Field) -> Self { pub fn new<F>(id: F) -> Self
where
F: Into<Field>,
{
Self { Self {
id: id, id: id.into(),
expire_time: Utc::now() + SessionEntry::EXPIRE_IN, expire_time: Utc::now() + SessionEntry::EXPIRE_IN,
} }
} }
fn id(&self) -> &Field { pub fn id(&self) -> &Field {
&self.id &self.id
} }
@@ -528,13 +531,23 @@ mod session_entries {
let entry = SessionEntry::new(id.clone()); let entry = SessionEntry::new(id.clone());
let end = Utc::now() + SessionEntry::EXPIRE_IN; let end = Utc::now() + SessionEntry::EXPIRE_IN;
assert_eq!(entry.id(), &id); assert_eq!(entry.id(), &id);
assert!(start < entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, start); assert!(
assert!(end > entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, end); start < entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
start
);
assert!(
end > entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
end
);
} }
#[test] #[test]
fn can_determine_if_entry_expired() { fn can_determine_if_entry_expired() {
let mut entry = SessionEntry::new(Uuid::nil().into()); let mut entry = SessionEntry::new(Uuid::nil());
let data = Utc::now(); let data = Utc::now();
entry.expire_time = data + Duration::from_secs(1); entry.expire_time = data + Duration::from_secs(1);
assert!(!entry.is_expired(), "entry should not be expired"); assert!(!entry.is_expired(), "entry should not be expired");
@@ -544,13 +557,23 @@ mod session_entries {
#[test] #[test]
fn can_expiration_be_reset() { fn can_expiration_be_reset() {
let mut entry = SessionEntry::new(Uuid::nil().into()); let mut entry = SessionEntry::new(Uuid::nil());
entry.expire_time = Utc::now(); entry.expire_time = Utc::now();
let start = Utc::now() + SessionEntry::EXPIRE_IN; let start = Utc::now() + SessionEntry::EXPIRE_IN;
entry.extend(); entry.extend();
let end = Utc::now() + SessionEntry::EXPIRE_IN; let end = Utc::now() + SessionEntry::EXPIRE_IN;
assert!(start < entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, start); assert!(
assert!(end > entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, end); start < entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
start
);
assert!(
end > entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
end
);
} }
} }
@@ -633,8 +656,18 @@ mod sessions {
let end = Utc::now() + SessionEntry::EXPIRE_IN; let end = Utc::now() + SessionEntry::EXPIRE_IN;
assert_eq!(result.id(), data.id()); assert_eq!(result.id(), data.id());
let entry = sess.entries.get(data.id()).unwrap(); let entry = sess.entries.get(data.id()).unwrap();
assert!(start < entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, start); assert!(
assert!(end > entry.expire_time, "{:?} should have been after {:?}", entry.expire_time, end); start < entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
start
);
assert!(
end > entry.expire_time,
"{:?} should have been after {:?}",
entry.expire_time,
end
);
} }
#[test] #[test]
@@ -697,8 +730,18 @@ mod sessions {
sess.entries.get_mut(&lose.id).unwrap().expire_time = Utc::now() - SessionEntry::EXPIRE_IN; sess.entries.get_mut(&lose.id).unwrap().expire_time = Utc::now() - SessionEntry::EXPIRE_IN;
let keep = sess.get(&Field::None); let keep = sess.get(&Field::None);
sess.expire(); sess.expire();
assert_eq!(sess.entries.len(), 1, "should only contain one entry, had {:?}", sess.entries); assert_eq!(
assert!(sess.entries.contains_key(&keep.id), "had {:?}, expected {:?}", sess.entries.keys(), &keep.id) sess.entries.len(),
1,
"should only contain one entry, had {:?}",
sess.entries
);
assert!(
sess.entries.contains_key(&keep.id),
"had {:?}, expected {:?}",
sess.entries.keys(),
&keep.id
)
} }
} }