use cognee_models::memory::MemoryEntry;
use serde::Deserialize;
use utoipa::ToSchema;
#[derive(Debug, Clone, Deserialize, ToSchema)]
#[serde(rename_all = "camelCase")]
pub struct RememberEntryRequestDTO {
#[schema(value_type = serde_json::Value)]
pub entry: MemoryEntry,
#[serde(default = "default_dataset_name", alias = "dataset_name")]
pub dataset_name: String,
#[serde(alias = "session_id")]
pub session_id: String,
}
fn default_dataset_name() -> String {
"main_dataset".to_string()
}
#[cfg(test)]
#[allow(
clippy::unwrap_used,
clippy::expect_used,
reason = "test code — panics are acceptable failures"
)]
mod tests {
use super::*;
use cognee_models::memory::QAEntry;
#[test]
fn parses_camel_case_payload() {
let raw = r#"{
"entry": {"type": "qa", "question": "Q?", "answer": "A."},
"datasetName": "ds",
"sessionId": "s1"
}"#;
let dto: RememberEntryRequestDTO = serde_json::from_str(raw).expect("parse");
assert_eq!(dto.dataset_name, "ds");
assert_eq!(dto.session_id, "s1");
match dto.entry {
MemoryEntry::Qa(QAEntry {
question, answer, ..
}) => {
assert_eq!(question, "Q?");
assert_eq!(answer, "A.");
}
other => panic!("expected qa, got {other:?}"),
}
}
#[test]
fn parses_snake_case_aliases() {
let raw = r#"{
"entry": {"type": "feedback", "qa_id": "qa-1"},
"dataset_name": "ds2",
"session_id": "s2"
}"#;
let dto: RememberEntryRequestDTO = serde_json::from_str(raw).expect("parse");
assert_eq!(dto.dataset_name, "ds2");
assert_eq!(dto.session_id, "s2");
assert!(matches!(dto.entry, MemoryEntry::Feedback(_)));
}
#[test]
fn dataset_name_defaults_to_main_dataset() {
let raw = r#"{
"entry": {"type": "qa", "question": "q", "answer": "a"},
"sessionId": "s"
}"#;
let dto: RememberEntryRequestDTO = serde_json::from_str(raw).expect("parse");
assert_eq!(dto.dataset_name, "main_dataset");
}
#[test]
fn unknown_entry_type_fails_to_parse() {
let raw = r#"{
"entry": {"type": "bogus"},
"sessionId": "s"
}"#;
let result: Result<RememberEntryRequestDTO, _> = serde_json::from_str(raw);
assert!(result.is_err());
}
}