usiem-notioner 0.0.2

Send Alerts to Notion. Library to be used to build a custom SIEM with the framework uSIEM
Documentation
use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

use super::{database::properties::*, block::{BlockElement}};


#[derive(Default, Debug, Deserialize, Serialize)]
pub struct PageElement {
    pub parent : DatabaseParent,
    pub properties : BTreeMap<String, PropertyValue>,
    #[serde(skip_serializing_if = "Vec::is_empty")]
    pub children : Vec<BlockElement>
}
#[derive(Default, Debug, Deserialize, Serialize)]
pub struct DatabaseParent {
    pub database_id : String
}

#[derive(Default, Debug, Deserialize, Serialize)]
#[serde(untagged)]
#[non_exhaustive]
pub enum PropertyValue {
    #[serde(rename = "title")]
    Title(TitleValue),
    #[serde(rename = "rich_text")]
    RichText(RichTextValue),
    #[serde(rename = "date")]
    Date(DateValue),
    #[serde(rename = "files")]
    Files,
    #[serde(rename = "checkbox")]
    CheckBox,
    #[serde(rename = "url")]
    Url,
    #[serde(rename = "email")]
    Email,
    #[serde(rename = "phone_number")]
    PhoneNumber,
    #[serde(rename = "formula")]
    Formula,
    #[serde(rename = "relation")]
    Relation,
    #[serde(rename = "Rollup")]
    Rollup,
    #[serde(rename = "number")]
    Number(NumberValue),
    #[serde(rename = "select")]
    Select(SelectValue),
    #[serde(rename = "multi_select")]
    MultiSelect(MultiSelectValue),
    #[serde(rename = "people")]
    People(PeopleProperty),
    #[serde(rename = "created_time")]
    CreatedTime(CreatedTimeValue),
    #[serde(rename = "last_edited_by")]
    LastEditedBy(LastEditedByProperty),
    #[serde(rename = "created_by")]
    CreatedBy(CreatedByProperty),
    #[serde(rename = "last_edited_time")]
    LastEditedTime(LastEditedTimeProperty),
    #[serde(rename = "status")]
    Status(StatusValue),
    #[default]
    #[serde(skip_deserializing)]
    Null
}


#[cfg(test)]
mod serialization {
    use crate::api::{block::*};

    use super::{*};
    use usiem::serde_json::{self, json};

    #[test]
    fn should_deserialize_page_element() {
        let _database_obj : PageElement = serde_json::from_value(json!({
            "parent": { "database_id": "d9824bdc84454327be8b5b47500af6ce" },
            "properties": {
                "Name": {
                    "title": [
                        {
                            "text": {
                                "content": "Tuscan Kale"
                            }
                        }
                    ]
                },
                "Price": { "number": 2.5 },
                "Food group": {
                    "select": {
                        "name": "Vegetable"
                    }
                },
                "Description": {
                    "rich_text": [
                        {
                            "text": {
                                "content": "A dark green leafy vegetable"
                            }
                        }
                    ]
                },
            },
            "children" : []
          })).unwrap();
    }

    #[test]
    fn check_serialization() {
        let mut properties = BTreeMap::new();
    properties.insert("Name".to_owned(), PropertyValue::Title(TitleValue::new("Testing Component")));
    properties.insert("Priority".to_owned(), PropertyValue::Select(SelectValue{
        select : SelectValueInternal {
            name : "Critical".to_owned()
        }
    }));
    properties.insert("MITRE".to_owned(), PropertyValue::MultiSelect(MultiSelectValue {
        multi_select : vec![MultiSelectValueInternal {
            name : "T1548.001 ".to_owned()
        }]
    }));
    let children = vec![
        BlockElement::HeadingOne(RichTextValue {
            rich_text: vec![RichTextObject::new("This is the content of an alert."), RichTextObject::new("In multiple lines?")]
        }),
        BlockElement::HeadingOne(RichTextValue {
            rich_text: vec![RichTextObject::new("In multiple lines"), RichTextObject::new("In multiple lines?")]
        })
    ];
    let new_page : PageElement = PageElement { parent: DatabaseParent {
        database_id : String::new()
    }, properties, children};

    let page_obj = serde_json::to_string(&new_page).unwrap();
    println!("{}", page_obj)
    }
}