1
0
Fork 0
mirror of https://github.com/Nutomic/ibis.git synced 2025-02-04 22:04:42 +00:00
ibis/src/backend/utils.rs

95 lines
2.9 KiB
Rust
Raw Normal View History

2024-01-03 12:29:25 +00:00
use crate::backend::error::MyResult;
2024-01-03 16:06:52 +00:00
use crate::common::DbEdit;
use crate::common::EditVersion;
2023-11-27 15:34:45 +00:00
use anyhow::anyhow;
use diffy::{apply, Patch};
use rand::{distributions::Alphanumeric, thread_rng, Rng};
2023-12-01 13:04:51 +00:00
use url::{ParseError, Url};
2023-11-21 15:27:18 +00:00
pub fn generate_activity_id(domain: &Url) -> Result<Url, ParseError> {
let port = domain.port().unwrap();
2024-01-24 16:12:17 +00:00
let domain = domain.host_str().unwrap();
let id: String = thread_rng()
.sample_iter(&Alphanumeric)
.take(7)
.map(char::from)
.collect();
2023-11-21 15:27:18 +00:00
Url::parse(&format!("http://{}:{}/objects/{}", domain, port, id))
}
2023-11-27 15:34:45 +00:00
/// Starting from empty string, apply edits until the specified version is reached. If no version is
/// given, apply all edits up to latest version.
///
/// TODO: testing
/// TODO: should cache all these generated versions
2023-11-28 12:04:33 +00:00
pub fn generate_article_version(edits: &Vec<DbEdit>, version: &EditVersion) -> MyResult<String> {
2023-11-27 15:34:45 +00:00
let mut generated = String::new();
2023-12-01 13:04:51 +00:00
if version == &EditVersion::default() {
return Ok(generated);
}
2023-11-27 15:34:45 +00:00
for e in edits {
let patch = Patch::from_str(&e.diff)?;
generated = apply(&generated, &patch)?;
2023-12-05 00:17:02 +00:00
if &e.hash == version {
2023-11-27 15:34:45 +00:00
return Ok(generated);
}
}
2023-11-28 12:04:33 +00:00
Err(anyhow!("failed to generate article version").into())
2023-11-27 15:34:45 +00:00
}
2023-12-05 11:54:38 +00:00
#[cfg(test)]
mod test {
use super::*;
use activitypub_federation::fetch::object_id::ObjectId;
use chrono::Utc;
2023-12-05 11:54:38 +00:00
use diffy::create_patch;
fn create_edits() -> MyResult<Vec<DbEdit>> {
let generate_edit = |a, b| -> MyResult<DbEdit> {
let diff = create_patch(a, b).to_string();
Ok(DbEdit {
id: 0,
2023-12-18 15:40:27 +00:00
creator_id: 0,
2023-12-05 11:54:38 +00:00
hash: EditVersion::new(&diff)?,
ap_id: ObjectId::parse("http://example.com")?,
diff,
summary: String::new(),
2023-12-05 11:54:38 +00:00
article_id: 0,
previous_version_id: Default::default(),
created: Utc::now(),
2023-12-05 11:54:38 +00:00
})
};
Ok([
generate_edit("", "test\n")?,
generate_edit("test\n", "sda\n")?,
generate_edit("sda\n", "123\n")?,
]
.to_vec())
}
#[test]
fn test_generate_article_version() -> MyResult<()> {
let edits = create_edits()?;
let generated = generate_article_version(&edits, &edits[1].hash)?;
assert_eq!("sda\n", generated);
Ok(())
}
#[test]
fn test_generate_invalid_version() -> MyResult<()> {
let edits = create_edits()?;
let generated = generate_article_version(&edits, &EditVersion::new("invalid")?);
assert!(generated.is_err());
Ok(())
}
#[test]
fn test_generate_first_version() -> MyResult<()> {
let edits = create_edits()?;
let generated = generate_article_version(&edits, &EditVersion::default())?;
assert_eq!("", generated);
Ok(())
}
}